2016-08-23 1 views
2

Ich mache derzeit ein Projekt, das große Datenmengen zu verwaltbaren Zahlen von Datenpunkten, die in Diagrammen geplottet werden können, umfasst.Excel VBA vs Javascript-Leistung zum Iterieren von großen Datensätzen

Ich schrieb den folgenden Code in Javascript, der durch einen Bereich von Daten iteriert und den ersten Wert bei einer gegebenen Schrittgröße auswählt, in diesem Fall Startwert = 0 und Schrittgröße = 0,1. Das funktioniert großartig und führt sehr schnell aus; Ich habe es nicht quantifiziert, aber definitiv < 1 Sekunde für> 10000 Datenpunkte.

var data = [ ... ]; 

var filteredData = []; 
var index = 0; 
var step = 0.1; 

for (var i=0; i < data.length; i++) { 
    if(data[i] >= index) { 
    filteredData.push(data[i]); 
    index+=step; 
    } 
} 

Codepen of Javascript with Mini Sample Dataset

jedoch alle unsere Daten kommt als in Excel Arbeitsbücher, so neu geschrieben ich den Code als Excel-Makro VBA wie folgt, um die Datenpunkte zu einem benachbarten Spalte ausgibt. Um die gleiche Anzahl von Datenpunkten zu verarbeiten, dauert es eine LANGE Zeit im Vergleich zum JS-Äquivalent, etwas in der Größenordnung von 20 Sekunden für 10000 Datenpunkte.

Dim dataRange As Range 
Set dataRange = Range(Range("A8"), Range("A8").End(xlDown)) 
Dim index As Double 
Dim stepsize As Double 
Dim outputRow As Integer 
index = 0 
step = 0.1 
outputRow = 8 

For Each cell In dataRange 
    If cell.Value >= index Then 
     ActiveSheet.Cells(outputRow, 2).Value = cell.Value 
     index = index + stepsize 
     outputRow = outputRow + 1 
    End If 
Next cell 

Warum gibt es so große Unterschiede zwischen den beiden Methoden? Gibt es irgendetwas, das an meinem VB-Code grandios ineffizient ist? Ich hoffe, diese Frage ist nicht zu vage!

Vielen Dank, Adam

Antwort

1

Ich nahm Inspiration von cyobashu, aber eeked einige Performance, indem man die wiederholten Aufforderungen an Redim Preserve und die Trasnpose Verfahren vermieden werden.

Wenn ich Cyboashu-Code gegen 1 m Zeilen ausführen, dauert es etwa 16 Sekunden. Wenn ich den folgenden Code gegen 1 m Zeilen anwende, dauert es ungefähr 1 Sekunde.

ich auch festgelegt habe, was ich denke, ist ein Tippfehler step = 0.1 sollte

Sub test() 
    Dim dataRange As Range 
    Set dataRange = Range(Range("A8"), Range("A8").End(xlDown)) 
    Dim index As Double 
    Dim stepsize As Double 
    Dim outputRow As Long 

    index = 0 
    stepsize = 0.1 
    outputRow = 8 


    '/ Array implementation in VBA 
    '/ Its almost at the same speed. 
    '---------------------------------------------------- 
    Dim lctr  As Long 
    Dim oRow  As Long 
    Dim arrOut() 
    Dim arr 
    arr = dataRange 

    ReDim arrOut(LBound(arr) To UBound(arr), LBound(arr, 2) To UBound(arr, 2)) As Variant 

    For lctr = LBound(arr) To UBound(arr) 
     If arr(lctr, 1) >= index Then 
      index = index + stepsize 
      oRow = oRow + 1 
      arrOut(oRow, 1) = arr(lctr, 1) 
     End If 
    Next 

    ActiveSheet.Cells(8, 2).Resize(oRow) = arrOut 

End Sub 
stepsize = 0.1 sein
4

Siehe Array Implementierung des Codes, die fast so schnell wie der JS.

Es dauert (zumindest auf meiner Maschine) Bruchteil einer Sekunde für 10.000 Datenpunkte.

Sub test() 

    Dim dataRange As Range 
    Set dataRange = Range(Range("A8"), Range("A8").End(xlDown)) 
    Dim index As Double 
    Dim stepsize As Double 
    Dim outputRow As Long 

    index = 0 
    step = 0.1 
    outputRow = 8 


    '/ Array implementation in VBA 
    '/ Its almost at the same speed. 
    '---------------------------------------------------- 
    Dim lctr  As Long 
    Dim oRow  As Long 
    Dim arrOut() 
    Dim arr 
    arr = dataRange 

    For lctr = LBound(arr) To UBound(arr) 
     If arr(lctr, 1) >= index Then 
      index = index + stepsize 
      oRow = oRow + 1 
      ReDim Preserve arrOut(1 To 1, 1 To oRow) 
      arrOut(1, oRow) = arr(lctr, 1) 
     End If 
    Next 

    arrOut = Application.Transpose(arrOut) 

    ActiveSheet.Cells(8, 2).Resize(UBound(arrOut)) = arrOut 

    '------------------------------------------------------------ 



' For Each cell In dataRange 
'  If cell.Value >= index Then 
'   ActiveSheet.Cells(outputRow, 2).Value = cell.Value 
'   index = index + stepsize 
'   outputRow = outputRow + 1 
'  End If 
'Next cell 

End Sub 
Verwandte Themen