Heim > Backend-Entwicklung > C++ > Warum ist das Lesen von C-Standardeingaben langsamer als das von Python und wie kann es verbessert werden?

Warum ist das Lesen von C-Standardeingaben langsamer als das von Python und wie kann es verbessert werden?

Barbara Streisand
Freigeben: 2024-12-26 16:29:09
Original
385 Leute haben es durchsucht

Why is C   Standard Input Reading Slower Than Python's, and How Can It Be Improved?

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage