Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 05.06.2014, 14:44 Titel: |
|
|
Code: | zahl += 1
If zahl = 27 then zahl = 1 |
Was ist damit?
Code: | zahl = iif(zahl = 26, 1, zahl +1) |
So, und jetzt ist die Lesbarkeit für einen ungeübten Programmierer völlig im Eimer.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 05.06.2014, 14:48 Titel: |
|
|
@nemored ... 20.6 sec's
entweder is das IIF als funktion hinterlegt, oder durch das else wird ein zweiter sprung gemacht, der zu na operation mehr führt, und dadurch langsamer wird.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 05.06.2014, 17:10 Titel: |
|
|
momohk hat Folgendes geschrieben: | Ich wollte ein wenig mit Verschlüsselung rum spielen und die einfachste Art ist ja jeden Buchstaben gegen einen anderen zu tauschen. |
Wikipedia: ROT13 (und auch ROT47)
Einfache Umsetzung davon:
http://beilagen.dreael.ch/QB/Rot13_Rot47.bas
Generell: Ich würde eine FUNCTION erstellen wie im Beispiel, um die Aufgabe des "Verschlüsseln" einkapseln zu können, um das Ganze wiederverwendbar zu machen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1280 Wohnort: Ruhrpott
|
Verfasst am: 06.06.2014, 08:13 Titel: |
|
|
@ThePuppetMaster:
Erstaunlich, bei mir ist der Zeitunterschied deutlich größer (20,9 : 98,4 Sekunden).
Aber der Vergleich hinkt ein wenig. Deine Variante imit dem "If" funktioniert nur, wenn "zahl" kontinuierlich hochgezählt wird, während nach der Aufgabenstellung von momohk jede beliebige Integerzahl verarbeitet werden soll. Das ist etwa so, als wenn du die Geradengleichung mit dem Bresenham-Algorithmus vergleichst.
Das Testprogramm sollte also etwa so aussehen: Code: | Dim As Integer zahl = 0
Dim As String alphabet = "zabcdefghijklmnopqrstuvwxy", buchstabe = " "
Dim As Double zeitmerken = Timer
For X as UInteger = 0 to &HFFFFFFFE
zahl = Int(Rnd * 2^30)
buchstabe[0] = alphabet[zahl Mod 26]
Next
Print Timer - zeitmerken
Sleep | Dabei scheint mir eine kleinere Obergrenze für x empfehlenswert, der Testlauf bei mir (zugegeben: mein Rechenknecht ist schon etwas betagt) hat 439,6 Sekunden gedauert.
@nemored: Zitat: | So, und jetzt ist die Lesbarkeit für einen ungeübten Programmierer völlig im Eimer. | Ein ungeübter Programmierer dürfte der ganzen Diskussion hier mit einer gewissen Verständnislosigkeit folgen...
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 06.06.2014, 10:10 Titel: |
|
|
Code: | Dim TZeit3 as Double
TT = Timer()
Dim zahl3 As Integer = 0
Dim Zahltemp3 as Integer
Dim alphabet3 As String = "zabcdefghijklmnopqrstuvwxy"
Dim buchstabe3 as String = " "
For X as UInteger = 0 to &HFFFFFFFE
zahl3 += 1
If zahl3 > 26 then zahl3 = zahl3 Mod 26
buchstabe3[0] = alphabet3[zahl3]
Next
TZeit3 += Timer() - TT
Print TZeit3
|
mit 18,2secs nur etwas langsamer als meine erste variante.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 07.06.2014, 01:51 Titel: |
|
|
so ihr geschwindigkeitsfanatiker
ich hab da mal alles zusammgetragen und selber noch was
dazu erfunden was bei mir zZ alle rekorde schlaegt.
Code: |
'grinstones random zahlen
Dim As Integer zahl = 0
Dim As String alphabet = "zabcdefghijklmnopqrstuvwxy", buchstabe = " "
'haubitze fixed stringlengt
Dim alphabet1 As String*26 = "zabcdefghijklmnopqrstuvwxy"
Dim As Double zeitmerken = Timer
For X as UInteger = 0 to &HFFFFFFFE
zahl += 1
buchstabe[0] = alphabet[zahl Mod 26]
Next
Print "grindstone count mod ptr: " & Timer - zeitmerken
zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
zahl = iif(zahl = 26, 1, zahl +1)
buchstabe[0] = alphabet[zahl]
Next
Print "nemored count iif ptr: " & Timer - zeitmerken
'ThePuppetMaster count if zahlen
zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
zahl += 1
If zahl = 26 then zahl = 1
buchstabe[0] = alphabet[zahl]
Next
Print "ThePuppetMaster count if ptr: " & Timer - zeitmerken
'ThePuppetMaster count zahlen
zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
zahl += 1
If zahl > 26 then zahl = zahl Mod 26
buchstabe[0] = alphabet[zahl]
Next
Print "ThePuppetMaster count if ptr 2: " & Timer - zeitmerken
'haubitze count zahlen
Dim buchstabe4 as String*1
zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
zahl += 1
buchstabe4[0] = alphabet[zahl And 27]
Next
Print "Haubitze count and ptr: " & Timer() - zeitmerken
zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
zahl +=1
buchstabe4[0] = alphabet1[zahl And 27]
Next
Print "Haubitze count and ptr fixed alphabet: " & Timer() - zeitmerken
zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
zahl = Int(Rnd * 2^30)
buchstabe[0] = alphabet[zahl Mod 26]
Next
Print "grindstone rnd mod ptr: " & Timer - zeitmerken
'absturz
'zeitmerken=Timer
'For X as UInteger = 0 to &HFFFFFFFE
' zahl = Int(Rnd * 2^30)
' If zahl = 27 then zahl = 1
' buchstabe[0] = alphabet[zahl]
'Next
'Print "ThePuppetMaster rnd if ptr: " & Timer - zeitmerken
'haubitze rnd zahlen
zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
zahl = Int(Rnd*2^30)
buchstabe4[0] = alphabet[zahl And 27]
Next
Print "Haubitze rnd and ptr: " & Timer() - zeitmerken
zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
zahl = Int(Rnd*2^30)
buchstabe4[0] = alphabet1[zahl And 27]
Next
Print "Haubitze rnd and ptr fixed alphabet: " & Timer() - zeitmerken
Sleep
'compiler flags: fbc -s console
'
'ergebnisse:
'grindstone count mod ptr: 18.10492339080611
'nemored count iif ptr: 16.36316170717009
'ThePuppetMaster count if ptr: 10.14280300711766
'ThePuppetMaster count if ptr 2: 11.26934865970065
'Haubitze count and ptr: 9.477473192258117
'Haubitze count and ptr fixed alphabet: 9.465687843810883
'grindstone rnd mod ptr: 193.9896897939169
'Haubitze rnd and ptr: 161.1050244443348
'Haubitze rnd and ptr fixed alphabet: 160.7653548807987
|
naja die stringlaenge zu begrenzen hatt nun nich wirklich was gebracht :/
erstaunlich finde ich aber mal wie langsam die sache wirklich wird
wenn man zufaellige zahlen nimmt.
salute |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 07.06.2014, 09:24 Titel: |
|
|
Zitat: | erstaunlich finde ich aber mal wie langsam die sache wirklich wird
wenn man zufaellige zahlen nimmt. |
Nun ja, die tatsächlich aufwendigen Rechenoperationen wie das *2^30 finden ja nur dort statt. Mit SHL 30 ist es schon schneller. Und wie schnell oder langsam RND ist, habe ich jetzt nicht getestet, aber hinter RND stecken auch ein paar Funktionsschritte.
Für so Varianten wie
Code: | zahl = iif(zahl = 26, 1, zahl +1)
|
oder auch die folgende IF-Version sollte man bitte vor der Schleife sicher stellen, dass zahl auf einen Wert < 26 zurückgestellt wird.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1280 Wohnort: Ruhrpott
|
Verfasst am: 07.06.2014, 10:01 Titel: |
|
|
@ ThePuppetMaster:
Da hast du leider wieder haarscharf an der Aufgabenstellung vorbeiprogrammiert. Auch wenn es hier etwas verklausulierter ist als bei deinem letzten Beispiel: Du machst nichts anderes, als eine Variable immer wieder von 1 bis 26 heraufzuzählen und dann wieder auf 1 zu setzen. Laut Aufgabenstellung wird die umzuwandelnde Zahl aber von außen vorgegeben und kann jede beliebige Integerzahl sein.
Außerdem ist die Umwandlung nicht korrekt, wie du sehen kannst, wenn du die Ausgabe einmal ausdruckst: Code: | Dim TZeit3 as Double
Dim TT As Double = Timer()
Dim zahl3 As Integer = 0
Dim Zahltemp3 as Integer
Dim alphabet3 As String = "zabcdefghijklmnopqrstuvwxy"
Dim buchstabe3 as String = " "
For X as UInteger = 0 to &HFFFFFFFE
zahl3 += 1
If zahl3 > 26 then zahl3 = zahl3 Mod 26
buchstabe3[0] = alphabet3[zahl3]
Print zahl3;" ";buchstabe3;" ";buchstabe3[0]
Sleep 1000
Next
TZeit3 += Timer() - TT
Print TZeit3 | Statt "z" wird hier ein Chr(0) ausgegeben.
@ Haubitze:
Das ist ja wirklich eine beeindruckende Fleißarbeit!
Leider muß ich auch bei deiner Idee sagen: Schnell, aber falsch! Wenn du die Berechnungen deines Programms ausdruckst, wirst du sehen, daß es ziemlichen Unsinn macht. Code: | Dim As Integer zahl = 0
Dim As String alphabet = "zabcdefghijklmnopqrstuvwxy"
Dim As Double zeitmerken = Timer
'haubitze count zahlen
Dim buchstabe4 as String*1
zeitmerken=Timer
For X as UInteger = 0 to &HFFFFFFFE
zahl += 1
buchstabe4[0] = alphabet[zahl And 27]
Print zahl;" ";buchstabe4;" ";buchstabe4[0]
Sleep 1000
Next | Und bei deiner Sektion "absturz" kann man sehr schön sehen, was passiert, wenn man beim Hantieren mit Pointern nicht aufpasst: Der dort berechnete Index liegt mit fast 100%iger Wahrscheinlichkeit weit außerhalb des erlaubten Bereichs, so daß das Betriebssystem das Programm beendet, damit es keinen Schaden anrichten kann.
Haubitze hat Folgendes geschrieben: | erstaunlich finde ich aber mal wie langsam die sache wirklich wird wenn man zufaellige zahlen nimmt. | Das stimmt, die Berechnung der Zufallszahlen ist ziemlich zeitaufwendig.
Die Idee dahinter war, von außen vorgegebene beliebige Integerzahlen zu simulieren, aber das ist eigentlich unnötig. Wenn man stattdessen das "x" aus der Zählschleife verwendet, rechnet man (fast) alle Zahlen um, die jemals vorkommen können, und das in wesentlich kürzerer Zeit: Code: | Dim As String alphabet = "zabcdefghijklmnopqrstuvwxy", buchstabe = " "
Dim As Double zeitmerken = Timer
For X as UInteger = 1 to &HFFFFFFFE
buchstabe[0] = alphabet[x Mod 26]
'Print x;" ";buchstabe;" ";buchstabe[0]
'Sleep 1000
Next
Print Timer - zeitmerken
Sleep | Bei mir läuft dieses Programm in 64,9 Sekunden durch (gegenüber 439,6 Sekunden mit Zufallszahlen).
Und jetzt seid ihr wieder dran.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 07.06.2014, 11:06 Titel: |
|
|
hm du hast recht, aber irendwo hatte ich mal gelesen
das man a MOD b durch a AND b+1 ersezen kann.
oder gabs da eine bestimte klausel wann man das einsetzen
kann?
naja auf jedenfall funzt dat nit... :/
danke fuer den hinweis.
salute
edit: ja man kann and einsetzen aber NUR wenn
der zu berechnende modulo ein vielvaches von 2
bzw 2^n ist. dann kann man statt a MOD b
auch a AND b-1 schreiben.
Code: |
For X as UInteger = 0 to 100'&HFFFFFFFE
Print X Mod 4, X And 3
Next
|
funzt supergut
NUR: da unser alphabet aber nicht 2^n buchstaben lang ist funzt
das is diesem falle nich :/
Edit2:
auf jeden fall sit das ein super beispiel fuer momohk wo er/sie
sehen kann wie man durch eine einfache "geschwindigkeitsteigerung"
sein ganzes program mal unfaehig machen kann. daher momohk
ueben ueben ueben  |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 07.06.2014, 14:11 Titel: |
|
|
Haubitze hat Folgendes geschrieben: | hm du hast recht, aber irendwo hatte ich mal gelesen
das man a MOD b durch a AND b+1 ersezen kann. |
Wenn das Allgemeingültig wäre, gäbe es ja keinen Grund, den langsamen Modulo-Operator überhaupt zu implementieren. Die allermeisten Bit-Schubsereien funktionieren nur mit Zahlen, die eine Zweierpotenz sind, also z.B. a MOD 4 ist äquivalent zu a AND 3. Als ich das letzte mal nachgeschaut habe, war 26 keine Zweierpotenz.
Allgemein sei hier noch angemerkt: In jedem Schleifendurchlauf die Modulo-Eigenschaft zu prüfen ist vergeudete Rechenzeit. Wenn einmal Modulo gerechnet wurde, kann man sich für die nächsten 25 durchläufe relativ sicher sein, dass der Wert kleiner 26 bleibt. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 07.06.2014, 19:42 Titel: |
|
|
hi jojo,
das gild aber nur dann wenn die uebergebenen werte gleichmaessig steigend oder fallend sind.
kommen zufaellige werte rein so muss man schon bei jedem schleifen-
durchlauf den modulo berechen. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 07.06.2014, 20:50 Titel: |
|
|
Nicht notgedrungen - TPM macht das ja mit einer vorhergehenden IF-Abfrage. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1280 Wohnort: Ruhrpott
|
Verfasst am: 08.06.2014, 14:33 Titel: |
|
|
nemored hat Folgendes geschrieben: | TPM macht das ja mit einer vorhergehenden IF-Abfrage. |
Korrigiert mich, wenn ich etwas falsches sage, aber meiner Meinung nach müsste die Mod-Funktion ziemlich schnell sein, da die Division mit Rest im Prozessor fest verdrahtet ist (Assemblerbefehl DIV bzw. IDIV), auf jeden Fall schneller als ein If..Then.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 08.06.2014, 15:38 Titel: |
|
|
Offenbar ist sie es nicht, jedenfalls was die ausgegebenen Zeitdauern schließen lassen. Mit der dahinter stehenden Technik kenne ich mich leider nicht aus. Müsste "man" sich mal an der Assembler-Datei anschauen, was FreeBASIC daraus macht.
Ich hätte auch gedacht, dass ein zuweisung=IIF() schneller sein müsste als eine Zuweisung gefolgt von einem IF. Letztendlich bestärkt mich das in meiner Philosophie, bzgl. Minimaloptimierung nicht so viel zu denken, sondern zur Not ein paar Nanosekunden Zeitverlust hinzunehmen.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 08.06.2014, 16:13 Titel: |
|
|
Division ist so ziemlich die langsamste Arithmetische Operation (einige dutzende Clocks), die du auf deinem Prozessor ausführen kannst. Ein Vergleich/Sprung ist wesentlich schneller, kann aber auf modernen Prozessoren (alles was in den letzten 20 Jahren an x86-Prozessoren so hergestellt wurde) natürlich zu einem Pipeline-Stall führen, was auch teuer ist, gerade wenn das Ergebnis der Abfrage nicht vorhersehbar ist.
Wenn dich die Sache interessiert, lohnt es sich, mal in die software optimization manuals von Agner Fog zu schauen, speziell "The microarchitecture of Intel, AMD and VIA CPUs: An optimization guide for assembly programmers and compiler makers" in diesem Fall. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1280 Wohnort: Ruhrpott
|
Verfasst am: 17.06.2014, 10:07 Titel: |
|
|
nemored hat Folgendes geschrieben: | Letztendlich bestärkt mich das in meiner Philosophie, bzgl. Minimaloptimierung nicht so viel zu denken, sondern zur Not ein paar Nanosekunden Zeitverlust hinzunehmen. | Das sehe ich auch so. Bei einem Programm, das auf Tastatureingaben wartet, ist eine Geschwindigkeitsoptimierung so sinnvoll wie Schlittschuhe in der Sahara.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
|