【发布时间】:2017-04-18 22:41:35
【问题描述】:
我正在阅读 sehe's answer 到 this question 并惊讶地发现使用 std::memchr 的手写循环比使用 std::count 快 3 倍以上(请参阅 cmets )。使用std::count的代码可以在编辑2中看到,但它基本上归结为:
const auto num_lines = std::count(f, l, '\n');
对比
uintmax_t num_lines = 0;
while (f && f != l)
if ((f = static_cast<const char*>(memchr(f, '\n', l - f))))
num_lines++, f++;
我原以为std::count 版本至少与std::memchr 版本一样快——原因与using std::copy should be at least as fast as std::memcpy 类似。
我检查了我的标准库 (libc++) 的 std::count 实现,并没有尝试优化 char 输入类型(std::find 同上)。
这是为什么?如果提供char* 迭代器和char 值,实现是否不能分派到std::memchr?
【问题讨论】:
-
它是开源的。提交补丁:-)。
-
@rici,哈哈......然而,实际上提交补丁通常是最简单的部分。应用它是真正的挑战。例如,我提交了一个 libstdc++ patch which specializes
std::find()用于简单的随机访问案例,只需调用__builtin_memchr()。这是 2 年前的事了 - 只是提交它并没有引起任何兴趣。
标签: c++ performance c++-standard-library