为什么此范围为Vectors求和的实现速度较慢
Why is this rangev3 implementation of vectors summation slower than the STD equivalent?
我正在考虑在我的库中使用rangev3。我喜欢Rangev3的语法,但优先级是性能。该库运行了许多矢量乘法和添加,其中大部分是128个样本。我使用Google基准测试来评估例如添加两个向量。范围版本比STD版本要慢得多(短量矢量长度的速度几乎慢10倍(。这有点令人惊讶,因为Rangev3(以及C 20中的未来STD ::范围(通常被认为具有良好的性能。
我在这里使用rangev3是否存在问题?还是与无法很好地展开Rangev3代码的编译器有关?还是仅针对许多雏菊链操作显示Rangev3性能增长?
注意:output = rng1;
分配不应分配内存,因为向量长度是相同的(我尝试使用范围:: copy,但速度慢了100倍(。我试图对矢量A和B进行预先化和随机化,但没有区别。我确实注意到,如果我在管道中进行了更多操作,则STL和RAGESV3之间的差距缩小,但仅用于长向量(连续5个连续操作32000以上(。
以下是具有性能指标的独立示例。我在4核I7 MacBook Pro上运行C 17 LLVM LIBC ,带有-O3标志。
#include <range/v3/all.hpp>
#include <benchmark/benchmark.h>
static void AddBenchmark(benchmark::State& state) {
const size_t length = state.range(0);
std::vector<double> B(length);
std::vector<double> A(length);
std::vector<double> output(length);
while (state.KeepRunning()) {
std::transform(A.begin( ), A.end( ), B.begin( ), output.begin(), std::plus<>( ));
benchmark::ClobberMemory(); // Force output to be written to memory.
}
}
BENCHMARK(AddBenchmark)->RangeMultiplier(8)->Range(1<<7, 1<<20);
static void AddRangesBenchmark(benchmark::State& state) {
const size_t length = state.range(0);
std::vector<double> B(length);
std::vector<double> A(length);
std::vector<double> output(length);
while (state.KeepRunning()) {
auto rng1 = ranges::view::transform(A, B, std::plus<>( ));
output = ranges::to<std::vector<double>>(rng1);
benchmark::ClobberMemory(); // Force output to be written to memory.
}
}
BENCHMARK(AddRangesBenchmark)->RangeMultiplier(8)->Range(1<<7, 1<<20);
BENCHMARK_MAIN();
输出
AddBenchmark/128 30.3 ns 30.2 ns 23194091
AddBenchmark/512 121 ns 121 ns 5758094
AddBenchmark/4096 1917 ns 1906 ns 417300
AddBenchmark/32768 25054 ns 24795 ns 28182
AddBenchmark/262144 385913 ns 382803 ns 1718
AddBenchmark/1048576 2100095 ns 2096442 ns 328
AddRangesBenchmark/128 218 ns 218 ns 3131249
AddRangesBenchmark/512 579 ns 579 ns 1169688
AddRangesBenchmark/4096 5071 ns 5069 ns 123231
AddRangesBenchmark/32768 50702 ns 50649 ns 14382
AddRangesBenchmark/262144 482216 ns 481333 ns 1288
AddRangesBenchmark/1048576 3349331 ns 3347475 ns 200
(太长时间评论(
当我尝试编译此代码时,我会得到:
<source>:1468:14: error: no match for 'operator=' (operand types are 'std::vector<double>' and 'ranges::transform2_view<ranges::ref_view<std::vector<double> >, ranges::ref_view<std::vector<double> >, std::plus<void> >')
1468 | output = rng1;
,我认为这是一个合法的错误。所以,也许您误用了?还是您想在那里使用::to<std::vector<double>>()
?
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 为什么在读取文件大小时文件IO速度会发生变化
- 如何在BST的这个简单递归实现中消除警告
- cv::connectedComponents vs cv::findContours 的实现和速度差异
- C# HashSet VS C++ std::unordered_set 使用自定义类键。C++慢...不可能。如何实现 C# 的速度?
- C++openssl SHA256运行速度比JDK SHA256实现慢
- 为什么此范围为Vectors求和的实现速度较慢
- 无法使用 openmp 实现所需的速度
- 可以在CUDA速度计算中实现TensorFlow自定义OP梯度
- 如何准确测量和比较opencl速度以实现循环功能的简单速度
- 随着线程数量的增加,OpenMP的实现速度越来越慢
- 我如何以可选速度实现独立的框架动作
- 不同计算机的算法与预编译引用实现的速度比不同
- OpenCV ORB GPU的实现速度比CPU慢
- 实现c++文件的速度有多快
- Perl正则表达式运行速度快于c++ Boost实现