草庐IT

c++ - 为什么 std::rotate 这么快?

为什么std::rotate比cplusplus.com描述的等效函数快这么多?cplusplus.com的实现:templatevoidrotate(ForwardIteratorfirst,ForwardIteratormiddle,ForwardIteratorlast){ForwardIteratornext=middle;while(first!=next){swap(*first++,*next++);if(next==last)next=middle;elseif(first==middle)middle=next;}}我有两种完全相同的插入排序算法,除了一种使用std:

c++ - 为什么 ARM NEON 不比普通 C++ 快?

这是一段C++代码:#defineARR_SIZE_TEST(8*1024*1024)voidcpp_tst_add(unsigned*x,unsigned*y){for(registerinti=0;i这是一个NEON版本:voidneon_assm_tst_add(unsigned*x,unsigned*y){registerunsignedi=ARR_SIZE_TEST>>2;__asm____volatile__(".loop1:\n\t""vld1.32{q0},[%[x]]\n\t""vld1.32{q1},[%[y]]!\n\t""vadd.i32q0,q0,q1\n\t

c++ - 为什么 ARM NEON 不比普通 C++ 快?

这是一段C++代码:#defineARR_SIZE_TEST(8*1024*1024)voidcpp_tst_add(unsigned*x,unsigned*y){for(registerinti=0;i这是一个NEON版本:voidneon_assm_tst_add(unsigned*x,unsigned*y){registerunsignedi=ARR_SIZE_TEST>>2;__asm____volatile__(".loop1:\n\t""vld1.32{q0},[%[x]]\n\t""vld1.32{q1},[%[y]]!\n\t""vadd.i32q0,q0,q1\n\t

c++ - 为什么这个 C 代码比这个 C++ 代码快?获取文件中的最大行

我有两个版本的程序基本上做同样的事情,在文件中获得最大的行长度,我有一个大约8000行的文件,我的C代码有点原始(当然!)比我在C++中的代码。C程序大约需要2秒才能运行,而C++中的程序需要10秒才能运行(我正在测试这两种情况的相同文件)。但为什么?我预计它会花费相同的时间或多一点时间,但不会慢8秒!我的C代码:#include#include#include#if_DEBUG#defineDEBUG_PATH"../Debug/"#else#defineDEBUG_PATH""#endifconstcharFILE_NAME[]=DEBUG_PATH"data.noun";intm

c++ - 为什么这个 C 代码比这个 C++ 代码快?获取文件中的最大行

我有两个版本的程序基本上做同样的事情,在文件中获得最大的行长度,我有一个大约8000行的文件,我的C代码有点原始(当然!)比我在C++中的代码。C程序大约需要2秒才能运行,而C++中的程序需要10秒才能运行(我正在测试这两种情况的相同文件)。但为什么?我预计它会花费相同的时间或多一点时间,但不会慢8秒!我的C代码:#include#include#include#if_DEBUG#defineDEBUG_PATH"../Debug/"#else#defineDEBUG_PATH""#endifconstcharFILE_NAME[]=DEBUG_PATH"data.noun";intm

c++ - 为什么 emplace_back 比 push_back 快?

我认为emplace_back会是赢家,当做这样的事情时:v.push_back(myClass(arg1,arg2));因为emplace_back会立即在vector中构造对象,而push_back会先构造一个匿名对象,然后将其复制到vector中。更多信息见this问题。Google还提供this和this问题。我决定将它们比较为一个将由整数填充的vector。这里是实验代码:#include#include#include#include#includeusingnamespacestd;usingnamespacestd::chrono;intmain(){vectorv1;

c++ - 为什么 emplace_back 比 push_back 快?

我认为emplace_back会是赢家,当做这样的事情时:v.push_back(myClass(arg1,arg2));因为emplace_back会立即在vector中构造对象,而push_back会先构造一个匿名对象,然后将其复制到vector中。更多信息见this问题。Google还提供this和this问题。我决定将它们比较为一个将由整数填充的vector。这里是实验代码:#include#include#include#include#includeusingnamespacestd;usingnamespacestd::chrono;intmain(){vectorv1;

c++ - std::vector reserve() 和 push_back() 比 resize() 和数组索引快,为什么?

我正在对一段代码进行快速性能测试voidConvertToFloat(conststd::vector&audioBlock,std::vector&out){constfloatrcpShortMax=1.0f/(float)SHRT_MAX;out.resize(audioBlock.size());for(size_ti=0;i我很高兴与最初的非常幼稚的实现相比加快了速度,处理65536个音频样本只需1毫秒多一点。不过只是为了好玩,我尝试了以下方法voidConvertToFloat(conststd::vector&audioBlock,std::vector&out){con

c++ - std::vector reserve() 和 push_back() 比 resize() 和数组索引快,为什么?

我正在对一段代码进行快速性能测试voidConvertToFloat(conststd::vector&audioBlock,std::vector&out){constfloatrcpShortMax=1.0f/(float)SHRT_MAX;out.resize(audioBlock.size());for(size_ti=0;i我很高兴与最初的非常幼稚的实现相比加快了速度,处理65536个音频样本只需1毫秒多一点。不过只是为了好玩,我尝试了以下方法voidConvertToFloat(conststd::vector&audioBlock,std::vector&out){con

c++ - 为什么 std::vector::operator[] 比 std::vector::at() 快 5 到 10 倍?

在程序优化过程中,试图优化一个遍历vector的循环,我发现以下事实:::std::vector::at()比operator[]慢得多!在发布和调试版本(VS2008x86)中,运算符[]比at()快5到10倍。在网上阅读了一下,我意识到at()具有边界检查功能。好的,但是,最多会减慢10倍的操作速度?!有什么理由吗?我的意思是,边界检查是一个简单的数字比较,还是我遗漏了什么?问题是这种性能下降的真正原因是什么?此外,有什么方法可以让它更快?我肯定会在其他代码部分(其中我已经有自定义边界检查!)中将所有at()调用与[]交换。概念证明:#define_WIN32_WINNT0x040