"String" wie in BlitzBasic (String wiederholen)

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

mpmxyz

Betreff: "String" wie in BlitzBasic (String wiederholen)

BeitragSa, Dez 19, 2009 23:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe BlitzMax schon ganze 2 Wochen testen können.
Eine Sache kann ich nicht verstehen:
Gibt es in BlitzMax keinen Befehl, der wie String funktioniert?
Sich eine Funktion dafür zu schreiben, wäre zwar ganz leicht, aber ich finde das ziemlich seltsam, dass das nicht schon eingebaut ist...
Habe ich etwas in der - nicht gerade extrem übersichtlichen - Hilfe übersehen, oder gibt es tatsächlich keinen Ersatz dafür?
mfG
mpmxyz

P.S.: Dieser Testcode kann mit dem "Import BB Project" nicht ohne Fehler umgewandelt werden:
BlitzBasic: [AUSKLAPPEN]
Print String("abc",3)
WaitKey
End


Edit: Hier ist ein Ersatz, der sogar von der Laufzeit gesehen fast optimal sein sollte:
BlitzMax: [AUSKLAPPEN]
Function RepeatString:String(Str:String,Count:Int)
Local newString:String=""
While Count<>0
If (Count & 1)<>0
newString=newString+Str
EndIf
Count=Count Shr 1
Str:+Str
Wend
Return newString
End Function
 

Ava

Gast

BeitragSo, Dez 20, 2009 0:24
Antworten mit Zitat
Ich war zugegeben im ersten Moment sehr skeptisch, als ich mir den Code angeschaut habe ... aber das Ding ist echt verdammt fix! Shocked

(10000 x "Hallo Welt" x 100 = ca. 75ms. // das selbe mit einfacher For-Next-Schleife zum Repeaten = ca. 950ms.)

mpmxyz

BeitragSo, Dez 20, 2009 0:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Beim Erstellen der Funktion habe ich mich von dieser Potenzfunktion inspirieren lassen.
Im Gegensatz zu der "sturen" For-Next-Methode ändert sich die Laufzeit logarithmisch statt linear zu der Anzahl an Wiederholungen.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Dreamora

BeitragSa, Dez 26, 2009 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Die funktion ist ganz nett Smile

Vor allem hat der 2^x ansatz nicht nur einen einfluss darauf, wieviel mal die schleife läuft.
Was eigentlich viel wichtiger ist, ist das du nur logarithmisch soviel müll produzierst, weil im normalfall jedes string = string + string / string :+ string zu 1-2 garbage objekten und einem neuen string führt, was bei strings sehr schnell viel speicher ist, speziell wenn der string so explosionsartig wächst wie hier.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

hazumu-kun

BeitragSa, Dez 26, 2009 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Mehr Ram Belastung ist fast immer der Preis für bessere Performance.

Man denke dabei mal an ein Speicherfeld mit 360 Elementen das die Sinuswerte cached.
Sicherlich im späterem Verlauf 10mal so schnell, dafür hat man aber etwas Ram (sinnvoll) verschenkt.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

mpmxyz

BeitragSa, Dez 26, 2009 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm...
Eigentlich wollte ich einige Argumente dafür bringen, dass hazumu-kuns Aussage nicht sehr viel mit dieser Funktion/diesem Problem zu tun hat... ("Was soll man daran vorrausberechnen?" etc.)
Nun ist mein PC auf seltsame Art und Weise abgestürzt und ich habe keine Lust, noch einmal das gleiche zu schreiben...
(Die BlitzMax-Pointer mögen mich anscheinend nicht... Wink )

Ich war dabei stehen geblieben, dass ich eben einen kleinen Geschwindigkeitstest in B3D gemacht habe.
Ergebnis: String nutzt die For-Next-Variante.

Außerdem ist mir aufgefallen, dass mein Algorithmus auch nicht optimal ist.
Wenn man den Speicher für den neuen String vorreservieren kann, dann ist die Laufzeit nur noch linear von der Länge des Ergebnisstrings abhängig.
(Ich schätze die maximale Laufzeit der jetztigen Funktion auf etwa O(n * log (n)) bis O(log(n) ^ 2) )

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Dreamora

BeitragSa, Dez 26, 2009 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
hazumu-kun hat Folgendes geschrieben:
Mehr Ram Belastung ist fast immer der Preis für bessere Performance.

Man denke dabei mal an ein Speicherfeld mit 360 Elementen das die Sinuswerte cached.
Sicherlich im späterem Verlauf 10mal so schnell, dafür hat man aber etwas Ram (sinnvoll) verschenkt.


Mehr RAM Belastung ist nicht das Problem hier.
Sondern das alle ausser dem letzten String getrasht werden und da die Strings gigantisch lang werden, steigt die zeit für alloc und dealloc erheblich an, weil der Speicher den der GC zur Verfügung hat jeweils bei jeder einzelnen String Operation zu klein sein wird und er den RAM entsprechend vom OS erbitten muss.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group