[C#] Jak na konečný automat

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod gandor 1. 10. 2015 12:50

Ano vyslovene pomale z hladiska mikrooptimalizacii a ano pucmeloudek ma pravdu, lebo na tomto nezalezi - kedze brzda je HDD a nie algoritmus.

PS. moje riesenie s konecnym automatom je radovo pomalsie, ale je to stale jedno - citatelnost/mnozstvo chyb/extensibilita je v 99% pripadov stale dolezitejsia ako cisty vykon skriptu.

PPS.
1, memset bude vzdy maximalne rovnako rychle ako for-cyklus a nastavovanie hodnoty na 0. Ale vo vecsine pripadov bude rychlejsie, pretoze loop-unrolling (t.z. for-cyklus neprebehne v kazdom cykle test ci je na konci, ale len 1x za 8 resp. 16 resp X (podla velkosti unrollnuteho cyklu) podmienok.
Druha vec je, ked hardware dokaze vykonat viac instrukcii naraz - co moze mat podporu v compilery a teda memset dokaze naraz v 1 cykle nastavit napriklad 4 hodnoty na 0 a tvoj kod len 1 (lebo potom ide k porovnaniu)
2, porovnavanie na zhodu retazcov vs strcmp funguje znova velmi podobne. Maximalne bude rovnako rychle/pomale ale pravdepodobne bude existovat rychlejsia hw implementacia.
3, memcopy to iste co memset (posuvanie hodnot bufferov)
4, pouzivas fread - buffrovana verzia readovania. Nebuffrovana verzia read (linux only) je rychlejsia lebo nema buffer navyse - dalsia "mrhanie"
5, C podporuje register premenne - pri spravnom zvoleni vybranych premennych dostanem znova zanedbatelne vyssi vykon, lebo premenna je v pamati blizsie k procesoru a je tam teda vyssi access time.
6, este som ani nespomenul assembler a moznosti co mi ponuka v oblasti mikrooptimalizacii

No a potom uz existuju algoritmicke vylepsenia ktore by si nasiel tym, ze by si si nastudoval problematiku... Napriklad nemusis sa posuvat vzdy po jednom znaku a testovat cely text, ale napriklad hladas prve pismeno zhody, ak matchne posunies sa dalej. Ak dalsie pismeno sa zhoduje posunies sa dalej. Ak dalsie sa nezhoduje, nemusis sa vratit na zaciatok, ale mozes ist dalej v streame - ale toto plati len ak ziadne s precitanych pismen sa nezhodovalo s inym (t.z. nenajdes substring) akonahle existuje substring, musis sa vratit k nemu a testovat od neho. Tymto tiez ziskam malinky vykon navyse oproti tebe.
gandor
Mírně pokročilý

Předchozí stránka

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků