草庐IT

OPTIMIZATION

全部标签

c++ - 在 C++ 中读取包含大量列和行的 csv 文件的最快方法

我有一个超过13列的竖线分隔数据文件。文件总大小超过100MB。我正在阅读每一行,将字符串拆分为std::vector所以我可以做计算。我对文件中的所有行重复此过程,如下所示:stringfilename="file.dat";fstreaminfile(filename);stringline;while(getline(infile,line)){stringitem;stringstreamss(line);vectorsplittedString;while(getline(ss,item,'|')){splittedString.push_back(item);}inta=s

c++ - 来自其他链接单元的垃圾

在讨论this主题时,我问自己以下问题。是否存在翻译单元中一些未使用的代码链接到GCC和VC++等流行编译器的最终可执行代码(当然是在Release模式下)的情况?例如假设我们有2个编译单元://A.hpp//Herearedeclarationsofsomeclasses,functions,externvariablesetc.和源文件//A.cpp//definationofA.hppdeclarations最后是主要内容//main.cpp//includingA.hpplibrary#include"A.hpp"//herewewillusesomestufffromA.hp

c++ - 如何使用逗号性能改进格式化数字?

我正在使用以下方法用逗号格式化数字:templatestaticstd::stringFormatNumberWithCommas(Tvalue,intnumberOfDecimalPlaces=0){std::stringstreamss;ss.imbue(std::locale(""));ss.precision(numberOfDecimalPlaces);ss分析显示此方法相对于其他代码要花费大量时间。具体来说,探查器已经确定了这一行:ss.imbue(std::locale(""));在其中我认为是std::locale("")花费了很长时间。我怎样才能提高这个方法的性能?如

c++ - 设计一个快速的 "rolling window"文件阅读器

我正在用C++编写一个算法,该算法使用“滑动窗口”扫描文件,这意味着它将扫描字节0到n,做一些事情,然后扫描字节1到n+1,做一些事情,等等,直到到达终点。我的第一个算法是读取前n个字节,做一些事情,转储一个字节,读取一个新字节,然后重复。这非常慢,因为从HDD一次一个字节地“读取文件”效率很低。(约100kB/s)我的第二个算法涉及将文件block(可能是n*1000字节,如果文件不太大则意味着整个文件)读入缓冲区并从缓冲区中读取单个字节。现在我得到大约10MB/s(不错的SSD+Corei5、1.6GHz笔记本电脑)。我的问题:您对更快的模型有什么建议吗?编辑:我的大缓冲区(相对于

c++ - 循环展开有利的条件以及返回率下降的点?

有人可以先解释一下展开循环(在C/C++中)在什么时候成为有用的优化吗?其次,联系第一个问题,什么时候不应该再展开了?是否应该始终将展开操作分成2的幂次方的批处理?还是跟你的CPU可以进行多少计算有关?比率是缓存行大小的倍数?等等例如,如果我有一个从0到99的for循环,哪个更好/我如何确定哪个(除了反复试验)-是否有科学方法:0到49和每个循环两个“操作”每个循环0到24和四个“操作”每个循环0到19和五个“操作”每个循环0到9和十个“操作” 最佳答案 我不能让关于循环展开的问题在这么长时间内无人回答而不提及Duff'sDevic

c++ - 当模板类型是基本类型时通过引用传递的成本

我一直听说确保最佳性能的良好做法是:按值传递基本类型(int、double...)通过const引用传递类如今,在编译器下使用C++11和完全优化,当通过const引用传递基本类型时是否会产生开销?此外,当T为int时,将执行以下功能:templateinlinevoidf(constT&x);慢于:templateinlinevoidf(constTx); 最佳答案 如果编译器真的内联代码(这对于简单模板很常见),则不会有任何区别。当无法内联函数并调用外联定义时,问题就很明显了。在那种情况下,传递引用可能会在访问变量时涉及额外的取

c++ - 支持单个位偏移的类似“memcpy”的函数?

我正在考虑解决这个问题,但它看起来是一项艰巨的任务。如果我自己拿这个,我可能会用几种不同的方式编写它并选择最好的,所以我想我会问这个问题,看看是否有一个好的图书馆已经解决了这个问题,或者是否有人有想法/建议。voidOffsetMemCpy(u8*pDest,u8*pSrc,u8srcBitOffset,sizesize){//Orsomethingalongtheselines.srcBitOffsetis0-7,sothepSrcbuffer//needstobeuptoonebytelongerthanitwouldneedtobeinmemcpy.//Maybeexplicit

java - 性能优化 : C++ vs Java not performing as expected

我编写了两个程序来实现一个简单的矩阵乘法算法,一个用C++编写,一个用Java编写。与我的预期相反,Java程序的运行速度比C++程序快大约2.5倍。我是C++的新手,希望就我可以在C++程序中进行哪些更改以使其运行更快提出建议。我的程序从这篇博文中借用了代码和数据http://martin-thoma.com/matrix-multiplication-python-java-cpp.以下是我正在使用的当前编译标志:g++-O3main.ccjavacMain.java以下是当前的编译器/运行时版本:$g++--versiong++.exe(GCC)4.8.1Copyright(C)

c++ - SSE Intrinsics 和循环展开

我正在尝试优化一些循环并且我已经成功了,但我想知道我是否只做了部分正确的事情。比如说我有这个循环:for(i=0;i将它展开3倍,产生这个:intunroll=(n/4)*4;for(i=0;i现在是SSE翻译等价物:__m128ai_v=_mm_loadu_ps(&a[i]);__m128two_v=_mm_set1_ps(2);__m128ai2_v=_mm_mul_ps(ai_v,two_v);_mm_storeu_ps(&b[i],ai2_v);或者是:__m128ai_v=_mm_loadu_ps(&a[i]);__m128two_v=_mm_set1_ps(2);__m12

c++ - 为什么 c++ string == (equality) 运算符比手动逐个检查字符快得多?

我在玩C++字符串,发现使用C++字符串==运算符比手动逐个检查字符要快得多:#include#include#includeusingnamespacestd;//assumess1ands2areofsamelengthboolmyEqual(string&s1,string&s2){inti=0;intj=0;while(i输出显示:MyEqual:18==operator:3对于较大的字符串,差异更为显着。我最初认为c++string==operator会做一些与手动逐个比较字符非常相似的事情,但显然它使用了一些优化来显着优于手动方法。c++string==操作符做了哪些优化?