- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
几个answers和讨论,甚至是source code boost::irange
的作者提到,在原始 for 循环中使用这些范围会降低性能。
但是,例如对于下面的代码
#include <boost/range/irange.hpp>
int sum(int* v, int n) {
int result{};
for (auto i : boost::irange(0, n)) {
result += v[i];
}
return result;
}
int sum2(int* v, int n) {
int result{};
for (int i = 0; i < n; ++i) {
result += v[i];
}
return result;
}
我发现生成的(-O3 优化)代码没有差异 ( Compiler Explorer )。有没有人看到使用这样的整数范围会导致现代编译器中更糟糕的代码生成的示例?
编辑:显然,调试性能可能会受到影响,但这不是我的目标。关于跨步(步长 > 1)示例,我认为可以修改 irange
代码以更接近地匹配跨步原始 for 循环的代码。
最佳答案
Does anyone see an example where using such an integer range could lead to worse code generation in modern compilers?
是的。并未说明您的特定案例受到影响。但是将步骤更改为 1
以外的任何其他内容:
#include <boost/range/irange.hpp>
int sum(int* v, int n) {
int result{};
for (auto i : boost::irange(0, n, 8)) {
result += v[i]; //^^^ different steps
}
return result;
}
int sum2(int* v, int n) {
int result{};
for (int i = 0; i < n; i+=8) {
result += v[i]; //^^^ different steps
}
return result;
}
Live .
虽然 sum
现在看起来更糟(循环没有展开),sum2
仍然受益于循环展开和 SIMD 优化。
要对您的编辑发表评论,确实可以将橙色代码修改得更接近
。但是:
如何适应range-based for loops展开后,boost::irange(0, n, 8)
必须创建某种临时的,实现 begin
/end
迭代器和前缀operator++
(这显然不像 int +=
操作那么简单)。编译器正在使用模式匹配进行优化,它被修剪以与标准 C++ 和标准库一起使用。因此,任何结果都来自 irange;如果它与编译器知道要优化的模式略有不同,优化将不会启动。我认为,这就是库的作者提到性能损失的原因。
关于c++ - 在原始循环上使用 boost::irange 的性能损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58855100/
我在 Visual Studio 2010 中使用 C#.net 4.0。我收到错误消息 Error 10 The type or namespace name 'IRange' could not
我使用Spreadsheetgear生成Excel工作簿。 我的工作簿非常简单: 我在单元格中插入字符串 第一行是粗体 我在标题周围和列之间绘制边框。 在过程结束时,我调用myRange.Colu
几个answers和讨论,甚至是source code boost::irange 的作者提到,在原始 for 循环中使用这些范围会降低性能。 但是,例如对于下面的代码 #include int s
这个问题有点哲理。 Python 2 中有出色的 itertools 模块,特别是提供了 Python 内置函数的生成器等价物,如 map、filter、zip,或切片。等价物分别称为 imap、if
我有一个游程编码向量,按顺序代表基因组上每个位置的某个值。作为一个玩具示例,假设我只有一条长度为 10 的染色体,那么我将得到一个如下所示的向量 library(GenomicRanges) set.
我正在使用 boost::irange 并创建了一个辅助函数,通过消除对显式模板参数的需要来简化代码。我不明白为什么它不起作用。代码如下: #include #include template b
这个问题在这里已经有了答案: Neatest way to loop over a range of integers (6 个答案) 关闭 3 年前。 随着范围合并到 C++20,我希望我们能得到
当我遇到这个 RangeGenerator 时,我正在浏览 Python Generators Wiki。讨论 irange() - 的页面 This will let us iterator ove
我正在尝试使用 Spreadsheet Gear 读取 Excel 文件的使用范围,目前我已将其设置为执行此操作: var workbook = Factory.GetWorkbookSet().Wo
我在计算间隔重叠时遇到了困难,正如我所期望的那样。这是一个 R data.table,其间隔由开始到结束定义: > library(data.table) > dt1 = data.table(sta
我正在尝试选择“使用范围”。我得到了工作表的 UsedRange,然后在其上调用 Select 函数。我在选择调用中收到 HRESULT 0x800a03ec。 这是代码: COleVariant 结
我是一名优秀的程序员,十分优秀!