?
dot schrieb:
Ich würde mal meinen bei derart riesigen Datenmengen (was ist eigentlich der Sinn davon sämlichte IPv4 Adressen in eine Datei zu schreiben!?) sollte, zumindest wenn es einigermaßen vernünftig implementiert ist, wohl die Schreibgeschwindigkeit der Festplatte und nicht irgendein Schleifenoverhead limitierender Faktor werden. Und daran kannst du auch mit asm nichts ändern.
Selbst wenn wir mal annehmen dass deine CPU nichts anderes tut dann brauchst du um 80GB zu schreiben (angenommene Schreibgeschwindigkeit: 70MB/s) immer noch 80 * 1024 / (70 * 60) = 19,5 min. Und das ist nur die Zeit die allein die Festplatte unter Idealbedingungen mindestens braucht um überhaupt 80GB zu schreiben. Und eine einigermaßen brauchbare Implementierung sollte ohne Probleme mehr als 70MB/s an Text generieren können (auf einer 1GHz CPU entspräche das 13950 Takten pro Zeichen ...
Da ist was drann.
Hab mal die Datei geschrieben - 68GB in 13 Minuten mit Intel CPU U7300 1.30GHz Hilfsmittel - grosser Schreibpuffer, Tabellen und Inline-Assembler.
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
FILE* file;
int main(void)
{
file = fopen("c:/test.txt", "w+b");
char tab1[256*4+1]; memset(tab1, '0', 256*4);
char tab2[256*4+1]; memset(tab2, '0', 256*4);
for (int i = 0; i < 256; i++)
{
if (i < 10)
{
sprintf(&tab1[i*4+2], "%d.", i); sprintf(&tab2[i*4+2], "%d", i); tab2[i*4+3] = 13;
tab1[i*4+4] = '0'; /*Null-Terminierung übrschreiben*/ tab2[i*4+4] = '0'; continue;
}
if (i < 100)
{
sprintf(&tab1[i*4+1], "%d.", i); sprintf(&tab2[i*4+1], "%d", i); tab2[i*4+3] = 13;
tab1[i*4+4] = '0'; tab2[i*4+4] = '0';
}
else
{
sprintf(&tab1[i*4], "%d.", i); sprintf(&tab2[i*4], "%d", i); tab2[i*4+3] = 13;
tab1[i*4+4] = '0'; tab2[i*4+4] = '0';
}
}
char* buf = (char*)malloc(256*256*256*17);
unsigned int raw_ip = 0;
_asm {
mov edx, raw_ip
L1:
push esi
push edi
push ebx
lea esi, tab1
lea ebx, tab2
mov edi, buf
mov ecx, 256*256*256
L2:
shld eax, edx, 8
and eax, 0ffh;
mov eax, [esi+eax*4]
stosd
shld eax, edx, 16
and eax, 0ffh;
mov eax, [esi+eax*4]
stosd
movzx eax, dh
mov eax, [esi+eax*4]
stosd
movzx eax, dl
mov eax, [ebx+eax*4]
stosd
mov al, 10
stosb
inc edx
dec ecx
jne L2
mov raw_ip, edx
pop ebx
pop edi
pop esi
push file
push 256*256*256*17
push 1
push buf
call dword ptr [fwrite]
add esp, 16
mov edx, raw_ip
or edx, edx
jne L1
}
fclose(file);
free(buf);
return 0;
}
:xmas1: