Warum das Lesen von C-Standardeingaben im Vergleich zur Effizienz von Python hinterherhinkt
Beim Vergleich der Leistung von Python und C beim Lesen von Zeilen von String-Eingaben aus dem Standard Eingabe (stdin) zeigte sich ein auffälliger Unterschied: C-Code lief deutlich langsamer. Dies führte zu einer Untersuchung der zugrunde liegenden Gründe für diese Leistungslücke.
Das Problem ist auf die Standardeinstellungen von C zurückzuführen. Standardmäßig werden istreams wie cin mit stdio synchronisiert, wodurch eine Eingabepufferung vermieden wird. Um die Leistung zu optimieren, kann diese Synchronisierung mit der Anweisung std::ios_base::sync_with_stdio(false) deaktiviert werden. Diese Anpassung mildert eine große Leistungseinschränkung.
Standardeingabestreams funktionieren konstruktionsbedingt unterschiedlich zwischen Python und C. Pythons sind normalerweise gepuffert, während Cs standardmäßig ungepuffert sind. Unter normalen Umständen reduziert die Pufferung Systemaufrufe und verbessert so die Effizienz. Die separaten Implementierungen und Puffer von FILE*-basierten stdio- und iostreams in C stellen jedoch potenzielle Probleme dar, wenn sie zusammen verwendet werden.
Um Pufferinkonsistenzen und unerwartete Ergebnisse zu vermeiden, synchronisiert C Streams standardmäßig mit stdio. Dies schützt zwar vor potenziellen Problemen, führt jedoch zu Mehraufwand, insbesondere bei der Verarbeitung großer Eingabemengen.
Um maximale Leistung zu erzielen, können Programmierer die Synchronisierung mithilfe der Methode sync_with_stdio deaktivieren. Durch diese Optimierung können C-Standard-Streams unabhängig voneinander gepuffert werden, was die Geschwindigkeit in bestimmten Szenarien erheblich verbessert.
Leistungsbenchmark
Für einen umfassenderen Vergleich finden Sie hier einen Leistungsbenchmark mit verschiedenen Ansätzen :
Implementation | Lines per second | |
---|---|---|
Python (default) | 3,571,428 | |
cin (default/naive) | 819,672 | |
cin (no sync) | 12,500,000 | |
fgets | 14,285,714 | |
wc | 54,644,808 | (Not a fair comparison) |
Es ist offensichtlich, dass das Deaktivieren der Synchronisierung und die Verwendung von Fgets zu bemerkenswerten Leistungsverbesserungen in C führt.
Das obige ist der detaillierte Inhalt vonWarum ist das Lesen von C-Standardeingaben langsamer als das von Python und wie kann es verbessert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!