c – 提高字符串的分配性能
发布时间:2020-12-16 09:51:50 所属栏目:百科 来源:网络整理
导读:我将 Java GC测试程序移植到C(参见下面的代码)以及 Python. Java和 Python的性能远远超过C,我认为这是因为每次都需要完成对new的所有调用.我尝试过使用Boost的fast_pool_allocator,但实际上性能从700ms提高到1200ms.我使用分配器是错误的,还是我应该做的其他
我将
Java GC测试程序移植到C(参见下面的代码)以及
Python. Java和
Python的性能远远超过C,我认为这是因为每次都需要完成对new的所有调用.我尝试过使用Boost的fast_pool_allocator,但实际上性能从700ms提高到1200ms.我使用分配器是错误的,还是我应该做的其他事情?
编辑:使用g -O3 -march = native –std = c 11 garbage.cpp -lboost_system编译. g是版本4.8.1 #include <string> #include <vector> #include <chrono> #include <list> #include <iostream> #include <boost/pool/pool_alloc.hpp> #include <memory> //#include <gc/gc_allocator.h> using namespace std; #include <sstream> typedef boost::fast_pool_allocator<char> c_allocator; //typedef std::allocator<char> c_allocator; typedef basic_string<char,char_traits<char>,c_allocator> pool_string; namespace patch { template <typename T> pool_string to_string(const T& in) { std::basic_stringstream<char,c_allocator> stm; stm << in; return stm.str(); } } #include "mytime.hpp" class Garbage { public: vector<pool_string> outer; vector<pool_string> old; const int nThreads = 1; //static auto time = chrono::high_resolution_clock(); void go() { // outer.resize(1000000); //old.reserve(1000000); auto tt = mytime::msecs(); for (int i = 0; i < 10; ++i) { if (i % 100 == 0) { cout << "DOING AN OLD" << endl; doOld(); tt = mytime::msecs(); } for (int j = 0; j < 1000000/nThreads; ++j) outer.push_back(patch::to_string(j)); outer.clear(); auto t = mytime::msecs(); cout << (t - tt) << endl; tt = t; } } void doOld() { old.clear(); for (int i = 0; i < 1000000/nThreads; ++i) old.push_back(patch::to_string(i)); } }; int main() { Garbage().go(); } 解决方法
问题是你每次都使用一个新的字符串流来转换一个整数.
修理它: namespace patch { template <typename T> pool_string to_string(const T& in) { return boost::lexical_cast<pool_string>(in); } } 现在的时间是: DOING AN OLD 0.175462 0.0670085 0.0669926 0.0687969 0.0692518 0.0669318 0.0669196 0.0669187 0.0668962 0.0669185 real 0m0.801s user 0m0.784s sys 0m0.016s 见它Live On Coliru 完整代码供参考: #include <boost/pool/pool_alloc.hpp> #include <chrono> #include <iostream> #include <list> #include <memory> #include <sstream> #include <string> #include <vector> #include <boost/lexical_cast.hpp> //#include <gc/gc_allocator.h> using string = std::string; namespace patch { template <typename T> string to_string(const T& in) { return boost::lexical_cast<string>(in); } } class Timer { typedef std::chrono::high_resolution_clock clock; clock::time_point _start; public: Timer() { reset(); } void reset() { _start = now(); } double elapsed() { using namespace std::chrono; auto e = now() - _start; return duration_cast<nanoseconds>(e).count()*1.0e-9; } clock::time_point now() { return clock::now(); } }; class Garbage { public: std::vector<string> outer; std::vector<string> old; const int nThreads = 1; void go() { outer.resize(1000000); //old.reserve(1000000); Timer timer; for (int i = 0; i < 10; ++i) { if (i % 100 == 0) { std::cout << "DOING AN OLD" << std::endl; doOld(); } for (int j = 0; j < 1000000/nThreads; ++j) outer.push_back(patch::to_string(j)); outer.clear(); std::cout << timer.elapsed() << std::endl; timer.reset(); } } void doOld() { old.clear(); for (int i = 0; i < 1000000/nThreads; ++i) old.push_back(patch::to_string(i)); } }; int main() { Garbage().go(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |