我不知道这是否属实,但当我在一个问题提供网站上阅读FAQ时,我发现了一些引起我注意的内容:
检查您的输入/输出方式。 在C ++中,使用cin和cout太慢了。 使用它们,您将无法解决任何具有适量输入或输出的问题。 而应该使用printf和scanf来代替。
能否有人澄清一下这个问题? 在C ++程序中,使用 scanf()比使用 cin >> something 快吗? 如果是的话,在C ++程序中使用它是一个好习惯吗? 我认为那只是 C语言 特有的,虽然我正在学习C ++...
我不知道这是否属实,但当我在一个问题提供网站上阅读FAQ时,我发现了一些引起我注意的内容:
检查您的输入/输出方式。 在C ++中,使用cin和cout太慢了。 使用它们,您将无法解决任何具有适量输入或输出的问题。 而应该使用printf和scanf来代替。
能否有人澄清一下这个问题? 在C ++程序中,使用 scanf()比使用 cin >> something 快吗? 如果是的话,在C ++程序中使用它是一个好习惯吗? 我认为那只是 C语言 特有的,虽然我正在学习C ++...
#include <stdio.h>
#include <unistd.h>
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
static int scanuint(unsigned int* x)
{
char c;
*x = 0;
do
{
c = getchar_unlocked();
if (unlikely(c==EOF)) return 1;
} while(c<'0' || c>'9');
do
{
//*x = (*x<<3)+(*x<<1) + c - '0';
*x = 10 * (*x) + c - '0';
c = getchar_unlocked();
if (unlikely(c==EOF)) return 1;
} while ((c>='0' && c<='9'));
return 0;
}
int main(int argc, char **argv) {
int parity = 0;
unsigned int x;
while (1 != (scanuint(&x))) {
parity ^= x;
}
parity ^=x;
printf("%d\n", parity);
return 0;
}
文件末尾有一个错误,但是这段 C 代码比更快的 C++ 版本要快得多。
paradox@scorpion 3845568-78602a3f95902f3f3ac63b6beecaa9719e28a6d6 ▶ make test
time ./xor-c < rand.txt
360589110
real 0m11,336s
user 0m11,157s
sys 0m0,179s
time ./xor2-c < rand.txt
360589110
real 0m2,104s
user 0m1,959s
sys 0m0,144s
time ./xor-cpp < rand.txt
360589110
real 0m29,948s
user 0m29,809s
sys 0m0,140s
time ./xor-cpp-noflush < rand.txt
360589110
real 0m7,604s
user 0m7,480s
sys 0m0,123s
原始的C++代码需要30秒,而C语言代码只需要2秒。
scanf
比 cin
快,也没关系。大多数情况下,你将从硬盘或键盘读取数据。将原始数据传递到您的应用程序需要比 scanf
或 cin
处理它花费更多的时间。iostream
比硬盘慢。是的,它确实很糟糕。 - polkovnikov.ph