นี่คือการทดสอบอย่างรวดเร็วของกรณีง่ายๆ: โปรแกรมอ่านรายการตัวเลขจากอินพุตมาตรฐานและ XOR ตัวเลขทั้งหมด
เวอร์ชัน iostream:
#include <iostream>
int main(int argc, char **argv) {
int parity = 0;
int x;
while (std::cin >> x)
parity ^= x;
std::cout << parity << std::endl;
return 0;
}
scanf รุ่น:
#include <stdio.h>
int main(int argc, char **argv) {
int parity = 0;
int x;
while (1 == scanf("%d", &x))
parity ^= x;
printf("%d\n", parity);
return 0;
}
ผล
ด้วยโปรแกรมที่สามฉันสร้างไฟล์ข้อความที่มีตัวเลขสุ่ม 33,280,276 เวลาดำเนินการคือ:
iostream version: 24.3 seconds
scanf version: 6.4 seconds
การเปลี่ยนการตั้งค่าการเพิ่มประสิทธิภาพของคอมไพเลอร์ดูเหมือนจะไม่ทำให้ผลลัพธ์เปลี่ยนแปลงไปมากนัก
ดังนั้น: มีความแตกต่างของความเร็วจริงๆ
แก้ไข:ผู้ใช้ clyfish ชี้ให้เห็นด้านล่างว่าความแตกต่างของความเร็วส่วนใหญ่เกิดจากฟังก์ชัน iostream I / O ที่รักษาการซิงโครไนซ์กับฟังก์ชัน CI / O เราสามารถปิดสิ่งนี้ได้โดยโทรไปที่std::ios::sync_with_stdio(false);
:
#include <iostream>
int main(int argc, char **argv) {
int parity = 0;
int x;
std::ios::sync_with_stdio(false);
while (std::cin >> x)
parity ^= x;
std::cout << parity << std::endl;
return 0;
}
ผลลัพธ์ใหม่:
iostream version: 21.9 seconds
scanf version: 6.8 seconds
iostream with sync_with_stdio(false): 5.5 seconds
C ++ iostream ชนะ! ปรากฎว่าการซิงค์ / ล้างข้อมูลภายในเป็นสิ่งที่ทำให้ iostream i / o ทำงานช้าลง ถ้าเราไม่ผสม stdio กับ iostream เราสามารถปิดได้แล้ว iostream จะเร็วที่สุด
รหัส: https://gist.github.com/3845568