/*
ロックなし
loop start
180ms
loop start
116ms
loop start
120ms
loop start
138ms
loop start
133ms
ロックあり
loop start
77ms
loop start
85ms
loop start
75ms
loop start
80ms
loop start
98ms
*/
#include <iostream>
#include <ppl.h>
#include <mutex>
#include <vector>
#include <string>
#include <chrono>
#include <memory>
using namespace std;
auto f_nolock()
{
constexpr auto n = 1000 * 1000;
vector<string> v;
v.reserve(n);
for ( auto i = 0; i < n; i++ )
{
v.push_back( string( static_cast<string::size_type>(100), 'B') );
}
vector<size_t> index_found;
cout << "loop start" << endl;
auto ts = std::chrono::system_clock::now();
vector<vector<size_t>> partial_results;
partial_results.resize(v.size());
Concurrency::parallel_for(size_t{}, v.size(),
[&](size_t i)
{
if ( v[i].find("AAA") != string::npos )
{
partial_results[i].push_back(i);
}
}
);
vector<size_t> results;
for ( auto &a : partial_results )
results.insert(results.end(), a.begin(), a.end());
auto te = std::chrono::system_clock::now();
cout << std::chrono::duration_cast<std::chrono::milliseconds>(te - ts).count() << "ms" << endl;
for ( auto & elem : index_found )
{
cout << elem;
}
}
auto f_lock()
{
constexpr auto n = 1000 * 1000;
vector<string> v;
v.reserve(n);
for ( auto i = 0; i < n; i++ )
{
v.push_back(string(static_cast<string::size_type>(100), 'B'));
}
vector<size_t> index_found;
cout << "loop start" << endl;
auto ts = std::chrono::system_clock::now();
mutex m;
Concurrency::parallel_for(size_t{}, v.size(),
[&](size_t i)
{
if ( v[i].find("AAA") != string::npos )
{
lock_guard<mutex> lock1{ m };
index_found.push_back(i);
}
}
);
auto te = std::chrono::system_clock::now();
cout << std::chrono::duration_cast<std::chrono::milliseconds>(te - ts).count() << "ms" << endl;
for ( auto & elem : index_found )
{
cout << elem;
}
}
int main()
{
cout << "ロックなし" << endl;
for ( auto i = 0; i < 5; i++ )
f_nolock();
cout << "ロックあり" << endl;
for ( auto i = 0; i < 5; i++ )
f_lock();
}