Rumah > Soal Jawab > teks badan
描述你的问题
向下面这个程序输入 10000000 个随机数后再输出需要用掉约 18 秒时间,其中输入用掉约 15 秒,输出用掉约 3 秒。这个速度比一台配置较低的 Linux 系统(g++ 和 clang++ 都试过)和一台 Windows XP 虚拟机(g++)慢得多(不到 4 秒)。printf()
和 scanf()
的速度是正常的。
贴上相关代码
test.cpp:(random.txt 是随机数文件。编译选项为 clang++ test.cpp -o test
。)
#include <iostream>
#include <ctime>
#include <cstdio>
using namespace std;
const int length = 10000000;
int array[length] = {};
int main()
{
freopen("random.txt", "r", stdin);
freopen("out.txt", "w", stdout);
clock_t start1, end1, end2;
start1 = clock();
for (int i = 0; i < length; i++) cin >> array[i];
end1 = clock();
for (int i = 0; i < length; i++) cout << array[i];
end2 = clock();
freopen("result.txt", "w", stdout);
cout << (double)(end1 - start1) / CLOCKS_PER_SEC << endl;
cout << (double)(end2 - end1) / CLOCKS_PER_SEC << endl;
return 0;
}
贴上报错信息
无
贴上相关截图
无
已经尝试过哪些方法仍然没解决(附上相关链接)
用 Instruments.app 的 Time Profiler 看过,但是看不懂……网上搜索过也没有结果。
更新:刚才又看了一遍 Instruments.app,发现 _pthread_mutex_unlock_slow
和 _pthread_mutex_lock_slow
在输入中花掉了很多时间。但我不知道它们是做什么用的。
附:OS X 版本 10.11.3,Xcode 版本为 7.1.1。
clang 版本:
clang++ --version
Apple LLVM version 7.0.0 (clang-700.1.76)
Target: x86_64-apple-darwin15.3.0
Thread model: posix
伊谢尔伦2017-04-17 13:23:50
原因可能有:
因为未知原因,与 stdio 的同步时间过长,请使用 std::ios::sync_with_stdio(false);
上一点实在是老生常谈了。据我自己所观察,libc++ 对于 iostream 的实现非常慢,两者同时关闭 stdio 同步的情况下,libstdc++ 要快 1100%。而 clang 默认指定的 -stdlib 是 libc++.
(对于上一点的解释)根据 Instruments.app 的结果,有可能 libc++ 对于 iostream 实现了线程安全,我没有看代码,但是标准中对于线程安全的规定是由实现而定的。
由于上面进行测试的两者版本都是 OS X 自带的,而且 OS X 自带的 libstdc++ 很老,也许新版本的 libstdc++ 也实现了线程安全。所以,请你重新进行指定 -stdlib=libstdc++ 的测试,并将 Instruments.app 的测试结果完善。