2017-06-16 3 views
2

Wenn ich ein C-Code habenWird der vorherige Standort schneller gefunden als die Suche nach einem neuen Standort?

off_t off = ftello(f); 
fseeko(f, some_location); 
// do some work 
fseeko(off); 

ist das zweite fseeko so langsam wie der erste? Ich hatte gedacht, dass die Dateiblöcke immer zwischengespeichert werden, also könnte die zweite viel schneller sein.

In meinem Profiling Ergebnisse auf Linux, der zweite fseek kostet ähnliche Kosten. Wird das erwartet?

+0

Es ist nicht die Suche, die schneller sein wird, aber schließlich nächste IOs ... –

+0

Ja - es wäre mehr überraschend, wenn es nicht wäre – 4386427

Antwort

1

Ist der zweite fseeko so langsam wie der erste?

Es kann sein.

Sie sehen, was Sie über Caching Holds sagen, aber nur Fälle, in denen Sie mit Vielfachen der FS-Blockgröße umgehen.

Ich würde vorschlagen, mehr in How is fseek() implemented in the filesystem? zu lesen, seit "Die fseeko() - Funktion ist identisch mit fseek (3) (siehe fseek (3)), jeweils mit Ausnahme des Offset-Arguments von fseeko().", As die ref schlägt vor.

3

In den meisten Implementierungen ist der Aufruf fseek fast frei, da nur die Position im Objekt FILE festgelegt wird. Die Kosten fallen an, wenn Sie tatsächlich Daten lesen. An diesem Punkt ist es sehr wahrscheinlich, dass das erneute Lesen eines bereits gelesenen Blocks von dem Puffercache profitieren wird. Es ist aber auch durchaus möglich, dass das OS spekulativ read-ahead ausführt, so dass Blöcke, die kürzlich gelesenen Blöcken folgen, auch im Puffer-Cache sind (wie es bei Ihrer zweiten Suche der Fall sein könnte).

Zum Schreiben sind die Messzeiten noch komplizierter, da die geschriebenen Blöcke nicht unbedingt sofort in den permanenten Speicher übergeben werden müssen; Der Systemaufruf write kehrt zurück, sobald die Daten in den Puffercache kopiert wurden.

Verwandte Themen