c++ - if 检查和 while 检查之间是否存在速度差异
问题描述
我正在解决一个问题,其中有一个条件为的主while循环,int i =0; while(i<vector.size())
并且在这个while循环内我有另一个while循环,如果索引中的当前元素是奇数,则增加i。比如while(i<vector.size()&&vector[i]%2!=0 )i++;
。我的问题是,如果我用 if 语句替换了第二个 while 循环,我的表现会有所不同吗?哪个会更快,为什么?我知道大 O 复杂度在这两种情况下都是 O(N),但我说的是现实世界的速度。如果重要的话,我正在使用 c++。编译器是否对 while 循环进行优化/在 if 语句中是否有更多检查等等?这只是出于好奇而提出的问题。
int i=0;
vector<int> temp(1000,1);
while(i<temp.size())
{
while(i<temp.size()&&temp[i]%2!=0)
{
i++;
}
}
或者
int i=0;
vector<int> temp(1000,1);
while(i<temp.size())
{
if(i<temp.size()&&temp[i]%2!=0)
{
i++;
}
}
解决方案
从性能的角度来看,差异可以忽略不计。并且任何体面的编译器都会根据您的优化设置将您的代码的两个片段转换为(几乎)相同的程序集。
从设计的角度来看,首先有两个循环或一个嵌套循环和一个 if inside 循环是没有意义的。因为您可以轻松地在一个循环中重写您的条件。
当涉及到性能比较问题时,首先要做的就是自己对代码进行基准测试。Godbolt是一个很棒的网站,可以检查不同代码和编译器生成的程序集差异。
确实,除非您正在使用非常非常非常特定的软件和硬件,这些软件和硬件不能延迟几个时钟周期,否则这种优化还为时过早。除非您非常了解您的平台和代码,否则编译器将在生成快速汇编方面胜过您。只需专注于获得正确且可读的代码。
推荐阅读
- python - 无法使用 Pycharm 安装 PIL
- tensorflow - 带有 num_oov_buckets 的 tf.lookup.StaticVocabularyTable 在 TF Serving 中不起作用
- android - 缩小 tablayout 和 view pager 之间的差距
- excel - 设置范围时下标超出范围
- reactjs - Cytoscapejs 在页面左侧显示节点信息
- python - 包含的 URLconf "" 中似乎没有任何模式
- java - 嵌套 JavaFX ExecutorService 关闭
- python - 通过边缘校正波浪图像
- nfs - 使用 nfs 时对文件信息的 getattr 请求过多
- azure - PowerBi Embedded 使用 .NET SDK 暂停和恢复容量