Wróciłem do mojej funkcji generującej CRC32 dla pliku i złapałem się na jednym przy testach (chciałem już przepisywać pod asm) - podczas liczenia obciążenie procesora nie przekracza 60%, tak więc nawet przepisanie tego niewiele by dało. Wąskim gardłem jest odczyt pliku czego się nie spodziewałem (Mam stosunkowo szybki dysk ~70MB /s, więc nie sądziłem, że tak lekko mu przyjdzie przerobić takie ilości danych). Ale wracając do tematu...
Aktualna wersja funkcji korzysta z fread ze standardowych bibliotek (stdlib) co wydawało mi się dobrym rozwiązaniem. Zauważyłem, że ogromne znaczenie ma zastosowana wielkość bufora, gdzie optymalną wielkością okazało się 8 KB (optymalna = najkrótszy czas liczenia). Przy <4KB szybkość odczytu znaczenia spadła. Można coś jeszcze z tym zrobić ? Inny sposób odczytu ? Klasy .Net-owe ? W sumie to nawet nie testowałem, z góry uznałem, że będą wolniejsze. A może po prostu jeszcze o czymś nie wiem.
Zastanawiałem się jeszcze nad jedną opcją. Odczytem danych na jednym wątku i liczeniu na drugim. W ten sposób pętla nie marnowała by czasu na liczenie, a jedynie cały czas odczytywała i wrzucała dane do jakiegoś globalnego bufora, a drugi wątek by je przetwarzał. Jednak z drugiej strony sądzę, że mogłoby to przysporzyć sporo problemów przy kodowaniu :/
Sami mi powiedzcie co o tym myślicie.
Aktualna wersja funkcji (liczenie dla pliku)
KOD cpp: UKRYJ
unsigned char* str = new unsigned char[8192];
unsigned long int crc32 = 0xFFFFFFFF;
char *aa = (char*)Runtime::InteropServices::Marshal::StringToHGlobalAnsi(file_path).ToPointer();
int len;
FILE *file = fopen(aa, "rb");
while (( len = fread(str, 1, 8192, file)) > 0)
for (int i = 0; i < len; i++)
crc32 = (crc32 >> 8) xor crc_table[(crc32 & 0xFF) xor str[i]]; // crc_table jest tablicą statyczną z wygenerowanymi wszystkim (256) wartościami - dla szybkości.
crc32 = crc32 xor 0xFFFFFFFF;
fclose(file);
return crc32.ToString("X");
unsigned long int crc32 = 0xFFFFFFFF;
char *aa = (char*)Runtime::InteropServices::Marshal::StringToHGlobalAnsi(file_path).ToPointer();
int len;
FILE *file = fopen(aa, "rb");
while (( len = fread(str, 1, 8192, file)) > 0)
for (int i = 0; i < len; i++)
crc32 = (crc32 >> 8) xor crc_table[(crc32 & 0xFF) xor str[i]]; // crc_table jest tablicą statyczną z wygenerowanymi wszystkim (256) wartościami - dla szybkości.
crc32 = crc32 xor 0xFFFFFFFF;
fclose(file);
return crc32.ToString("X");
Wielkiej filozofii tu nie ma.