草庐IT

c++ - 为什么迭代 std::set 比迭代 std::vector 慢得多?

在优化性能关键代码时,我注意到迭代std::set有点慢。然后我编写了一个基准测试程序,并测试了迭代器(autoit:vector)对vector的迭代速度,迭代器对集合的迭代速度,以及索引(inti=0;i)对vector的迭代速度。容器的构造相同,有1024个随机整数。(当然,每个int都是唯一的,因为我们使用的是集合)。然后,对于每次运行,我们循环遍历容器并将它们的整数相加为一个长整型。每次运行有1000次迭代求和,测试是1000次运行的平均值。这是我的结果:Testingvectorbyiterator✓Maximumduration:0.012418Minimumdurati

c++ - 带有 mexCallMATLAB 的 Matlab mex 文件比相应的 m 文件慢近 300 倍

为了减少运行时间,我开始用C++实现一些m文件。m文件生成n维点并计算这些点处的函数值。这些函数是用户定义的,它们作为函数句柄传递给m文件和mex文件。mex文件使用带有feval的mexCallMATLAB来查找函数值。我构建了以下示例,其中将在Matlab命令行中构建的函数句柄fn传递给matlabcallingmatlab.m和mexcallingmatlab.cpp例程。使用新打开的Matlab,mexcallingmatlab在241.5秒内评估此函数200000,而matlabcallingmatlab在0.81522秒内评估它,因此mex实现速度减慢296倍。这些时间是第

c++ - 为什么在文件 I/O 中读取数据 block 比逐字节读取更快

我注意到逐字节读取文件比使用fread读取文件需要更多时间来读取整个文件。根据cplusplus:size_tfread(void*ptr,size_tsize,size_tcount,FILE*stream);从流中读取count个元素的数组,每个元素的大小为size字节,并将它们存储在ptr指定的内存块中。Q1)那么,fread又是按1字节读取文件,这不是和按1字节方法读取一样吗?Q2)结果证明fread花费的时间更少。来自here:Iranthiswithafileofapproximately44megabytesasinput.WhencompiledwithVC++2012

c++ - 为什么函数的递归版本比 C 中的迭代版本更快?

我正在检查梯度下降的两种实现方式之间的区别,我的猜测是在编译器优化之后,两个版本的算法将是等效的。令我惊讶的是,递归版本明显更快。我没有丢弃任何版本的实际缺陷,甚至没有丢弃我测量时间的方式。你们能给我一些见解吗?这是我的代码:#include#include#include#include#includedoublef(doublex){return2*x;}doubledescgrad(doublexo,doublexnew,doubleeps,doubleprecision){//printf("step...x:%fXp:%f,delta:%f\n",xo,xnew,fabs(x

c++ - unique_lock 与使用互斥锁相比有什么特殊用途?

我不太清楚为什么std::unique_lock比仅使用普通锁有用。我正在查看的代码示例是:{//aquirelockstd::unique_locklock(queue_mutex);//addtasktasks.push_back(std::function(f));}//releaselock为什么这个比queue_mutex.lock();//addtask//...queue_mutex.unlock();这些代码片段是否完成了同样的事情? 最佳答案 [Do]thesesnippetsofcodeaccomplishthe

c++ - 为什么 std::mutex 比 CRITICAL_SECTION 慢两倍

std::mutex是用关键部分实现的,这就是为什么它比OSMutex(在Windows上)快得多。但是它不如WindowsCRITICAL_SECTION快。计时只是一个线程中的一个紧密循环:423.76nsATLCMutex41.74nsstd::mutex16.61nswin32CriticalSection我的问题是std::mutex还做了什么?我查看了来源,但无法理解。然而,在它服从CritSec之前还有额外的步骤。我的问题是:这些额外的步骤是否有用?也就是说,额外的步骤是什么?使用CRITICAL_SECTION我会错过什么?还有,如果它不是用Mutex实现的,为什么他们

c++ - 为什么这个简单的 lambda 在 std::thread 中始终比在 gcc 4.9.2 的 main 函数中运行得更快?

以下代码片段采用一个命令行参数,该参数表示要生成的线程数以同时运行一个简单的for循环。如果传递的参数为0,则不会生成std::thread。在gcc4.9.2上,./snippet0比./snippet1平均花费10%,即生成一个std的版本::thread执行循环比仅在main中执行循环的版本更快。有人知道这是怎么回事吗?clang-4根本没有表现出这种行为(带有一个std::thread的版本较慢),gcc6.2具有带有一个std::thread的版本运行得稍微慢一点更快(以十次试验中花费的最少时间作为测量值)。这是片段:ScopedNanoTimer只是一个简单的RAII计时器

c++ - 在 Visual Studio Ctrl+F5 中发布版本比从外部 VS 慢 10 倍

很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visitthehelpcenter.8年前关闭。我有一个中等大小的nativeC++应用程序。当我在VisualStudio(2008)中运行它时,它的运行速度大约比从VisualStudio外部运行时慢10倍。这适用于Debug和Release版本,并且在我以StartDebugging运行应用程序时都会发生。(F5)和StartWithoutDebugging(Ctrl+F5)。换句话说:在VisualStudio中运行发布版本没有调试器比

c++ - 对于简单的 StereoBM 算法,为什么我的代码比 opencv 慢得多?

这是我的测试代码,用于实现一个简单的testBM算法,没有预过滤。但当窗口尺寸较大时,它需要大约400毫秒甚至更多,而opencv的StereoBM(CPU而非GPU)需要20毫秒。我已经检查了StereoBM的来源,但我很难理解它。有谁知道为什么?下面是我的代码。voidtestBM(constMat&left0,constMat&right0,Mat&disparity,intSAD,intsearchRange){intcols=left0.cols;introws=left0.rows;inttotal=cols*rows;constuchar*data_left=left0.

c++ - 并行 for_each 比 std::for_each 慢两倍以上

我正在阅读C++ConcurrencyinAction安东尼·威廉姆斯。在关于设计并发代码的章节中有并行版本的std::for_each。算法。这是本书中略微修改的代码:join_thread.hpp#pragmaonce#include#includeclassjoin_threads{public:explicitjoin_threads(std::vector&threads):threads_(threads){}~join_threads(){for(size_ti=0;i&threads_;};parallel_for_each.hpp#pragmaonce#include