我有验证码
const int N = 100000000;
int main() {
FILE* fp = fopen("result.txt", "w");
for (int i=0; i<N; ++i) {
int res = f(i);
fprintf (fp, "%d\t%d\n", i, res);
}
return 0;
}
这里f
在单线程中平均运行几毫秒。
为了使其更快,我想使用多线程。
i
的方法?还是我需要锁定,获取,添加和解锁?f(7)
之前解决f(3)
,我是否需要一个临时存储器?f(3)
且临时存储器已满? 我当前正在使用C ++ 11,但是可以要求使用更高版本的C ++
答案 0 :(得分:0)
一般规则如何提高性能:
1.
点开始进行测量,并确定更改是否提供了预期的改进。现在在您的示例中,只需将结果拆分为8个(或更多)单独的文件,并在需要时最后将它们合并。
这看起来像这样:
#include <vector>
#include <future>
#include <fstream>
std::vector<int> multi_f(int start, int stop)
{
std::vector<int> r;
r.reserve(stop - start);
for (;start < stop; ++start) r.push_back(f(start));
return r;
}
int main()
{
const int N = 100000000;
const int tasks = 100;
const int sampleCount = N / tasks;
std::vector<std::future<std::vector<int>>> allResults;
for (int i=0; i < N; i += sampleCount) {
allResults.push_back(std::async(&multi_f, i, i + sampleCount));
}
std::ofstream f{ "result.txt" }; // it is a myth that printf is faster
int i = 0;
for (auto& task : allResults)
{
for (auto r : task.get()) {
f << i++ << '\t' << r << '\n';
}
}
return 0;
}