Danke Sirius und Blackjack.
Die Problemstellung ist ein Teil meiner Bachelorarbeit, worin ich eine IDE programmiere.
Die Autocompletion soll diese Liste von Wörtern bekommen und das möglichst oft. Da ich einige Ideen habe, wie z.B. Scope basierte Autocompletion. Das heißt soviel wie: wo sich der Cursor derzeit befindet, in dessen Scope sollen auch nur Vorschläge gemacht werden. Zum Beispiel wenn sich der Cursor in einer for Schleife befindet, soll ich auch nur dort die Zählvariable als Vorschlag bekommen und nicht außerhalb.
Dafür muss natürlich in jeder Änderung des Cursors oder wenn ein Wort fertig geschrieben wurde oder gelöscht wurde etc. diese Funktion ausgeführt werden um immer die aktuellsten Vorschläge in der Autocompletion zu haben. Das kann natürlich teilweise dazu führen, dass mehre male pro Sekunde eine Datei durchstöbert werden muss, welche weit über 100 Zeilen hat.
Ich habe jetzt einmal deinen Python Vorschlag genommen:
Code: Alles auswählen
import re
string = open('test2.rs', 'r').read()
result = list(re.finditer('[$@]\w+', string))
und ihn mit einer Datei, welche aus 160 Zeilen Code besteht 500 mal (mithilfe von avgtime:
https://github.com/jmcabo/avgtime) durchlaufen lassen.
Das ist das Ergebnis, was die Python RegEx Variante erzielt hat:
Code: Alles auswählen
Total time (ms): 9665.63
Repetitions : 500
Sample mode : 19 (207 ocurrences)
Median time : 19.53
Avg time : 19.3313
Std dev. : 1.21324
Minimum : 14.054
Maximum : 23.495
95% conf.int. : [16.9533, 21.7092] e = 2.37792
99% conf.int. : [16.2061, 22.4564] e = 3.12511
EstimatedAvg95%: [19.2249, 19.4376] e = 0.106344
EstimatedAvg99%: [19.1915, 19.471] e = 0.139759
und mein C Code, welcher noch nicht sehr optimiert ist, da z.B. noch bei jedem neuen Wort neue Speicherplatz mit malloc frei geschoben wird, statt der Nutzung eines Speicherpools und ähnlicher Sachen:
Code: Alles auswählen
Total time (ms): 1481.85
Repetitions : 500
Sample mode : 2.6 (86 ocurrences)
Median time : 2.7595
Avg time : 2.9637
Std dev. : 0.826546
Minimum : 1.743
Maximum : 7.716
95% conf.int. : [1.3437, 4.5837] e = 1.62
99% conf.int. : [0.834658, 5.09274] e = 2.12904
EstimatedAvg95%: [2.89125, 3.03615] e = 0.0724486
EstimatedAvg99%: [2.86848, 3.05891] e = 0.0952136
Meiner Meinung nach ist der Unterschied schon jetzt sehr deutlich.
Des Weiteren hab ich die volle Kontrolle über die Erweiterung und Anpassung dieser Funktion und muss mich nicht mit einem immer komplexer werdenden regex auseinandersetzen, welchen ich wahrscheinlich selber nicht mehr nach 1-2 Monaten verstehe
