- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我创建了一个非常简单的基准测试来说明短字符串优化,并在 quick-bench.com 上运行它。该基准测试在比较禁用/启用 SSO 的字符串类方面非常有效,结果与 GCC 和 Clang 非常一致。然而,我意识到当我禁用优化时,报告的时间比启用优化(-O2
或 -O3
)观察到的时间快 4 倍左右,GCC 和 clang 。
基准在这里:http://quick-bench.com/DX2G2AdxUb7sGPE-zLRa41-MCk0 .
知道什么可能导致未优化的基准运行速度快 4 倍吗?
不幸的是,我看不到生成的程序集;不知道问题出在哪里(选中“记录反汇编”框但对我的运行没有影响)。此外,当我使用 Google Benchmark 在本地运行基准测试时,结果符合预期,即优化后的基准测试运行得更快。
我还尝试在 Compiler Explorer 中比较这两种变体,未优化的变体似乎执行了更多的指令:https://godbolt.org/z/I4a171 .
最佳答案
因此,正如评论中所讨论的那样,问题在于 quick-bench.com 并未显示基准测试代码的绝对时间,而是相对于无操作基准测试所用时间的时间。空操作基准可以在 quick-bench.com 的源文件中找到:
static void Noop(benchmark::State& state) {
for (auto _ : state) benchmark::DoNotOptimize(0);
}
一次运行的所有基准测试都是一起编译的。因此,优化标志也适用于它。
Reproducing and comparing the no-op benchmark for different optimization levels可以看到,从 -O0
到 -O1
版本大约有 6 到 7 倍的加速。当比较使用不同优化标志完成的基准测试运行时,必须考虑基线中的这个因素来比较结果。因此,在问题的基准测试中观察到的 4 倍加速不仅仅是补偿,而且行为确实符合人们的预期。
-O0
和 -O1
之间的空操作编译的一个主要区别是对于 -O0
有一些断言和google-benchmark 代码中的其他附加分支,已针对更高的优化级别进行了优化。
此外,在 -O0
循环的每次迭代都会多次加载到寄存器、修改和存储到 state
的内存部分,例如用于递减循环计数器和循环计数器上的条件,而 -O1
版本会将 state
保存在寄存器中,从而无需在循环中加载/存储内存。前者要慢得多,每次迭代至少需要几个周期来进行必要的存储转发和/或从内存中重新加载。
关于c++ - 禁用优化后 quick-bench.com 上的基准测试速度要快得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58167392/
当我打开一个 Xcode 项目时,快速帮助功能工作得很好,但是当打开一个不在打开的项目中的文件(例如 abc.swift )时,文档不会出现。 下面是一个例子: 最佳答案 安装版本Command Li
我扩展了org.eclipse.ui.editors.text.TextEditor来实现自定义编辑器。对于此编辑器,我定义了一个标记类型(org.eclipse.core.resources.mar
我将 Xcode 7 beta 5(这是当前安装的唯一 xcode)与 Swift 2 一起使用,当我尝试使用 Quick 运行单元测试时,出现以下错误: error: module file was
我有一个 Excel 文档,从另一个 xls 中提取项目作为列表项来填充下拉菜单。问题是,有很多选择。我找不到快速到达我想要的区域的方法。 (例如,打开下拉列表并按“b”不会像大多数普通下拉列表那样转
如果出现给定情况,我有一组测试会使整个测试套件崩溃。而且,那种情况对于套件来说已经是失败了。 与其崩溃,我宁愿在系列设置期间测试条件是否为真,并在失败时快速中止它。 这可能吗? 最佳答案 是的,您可以
Currentyl 我正在开发一个 Java Web 应用程序,一些简单的 JSF + Spring + Hibernate 教科书应用程序架构,但我发现每次我必须这样做时,我都会在将 WAR 上传到
当我使用 --quick option 运行 mysql 时正如另一个网络帖子中所建议的描述 返回很多 -- 而当我在没有 --quick 的情况下运行 mysql 时选项 desc table返回正
是解决Quick sort中最差时间复杂度的中位数3吗? 还有, 使用 3 的中位数方法时是否存在最坏情况的时间复杂度? 最佳答案 我认为一直以中位数为基准的快速排序的最差时间复杂度是 O(nlogn
我想创建一个自定义对话框,例如联系人应用程序中的“快速联系”或官方 Twitter 应用程序中的对话框。当我点击一个按钮时,它会在按钮上方或下方打开。 http://londatiga.net/ima
开始为 Linux 平台编写 C 代码,我正在使用 man 工具来获取有关标准库函数的信息。现在我想知道有什么解决方案可以轻松获取有关这些函数使用的结构的信息。 此处的示例是 man sched_se
1.视图模型介绍 在qml中、常见的view视图有: listview: 列表视图,视图中数据来自listmodel、xmllistmodel或c++中继承自qabstractitemmo
目录 1.Popup介绍 2.自定义Popup 1.Popup介绍 Popup是一个弹出窗口的控件 它的常用属性如下所示: ancho
PathView ,顾名思义,沿着特定的路径显示 Model 内的数据。 Model 能够是 QML 内建的 ListModel 、 XmlListModel ,也能够是在 C++ 中实现的 QAb
[对于那些不在家的人,这是 Rolling My Own Version Control 的续集;)] 所以我放弃并安装了 TortoiseSVN(为了和 friend 一起做一个项目,我的个人版本控
我试图在Qt Quick应用程序中打开一个链接,收到functions are not supported in Qt Quick ui form警告,该应用程序正常工作,我想摆脱该警告,如何解决此警
我对 Qt 和 Qt Quick 非常陌生。我正在验证 Qt Quick 的 Qt Test 单元测试框架,但我无法理解如何运行测试。这就是我所拥有的,我创建了一个具有以下结构的 SUBDIRS 项目
我有执行简单选择的存储过程。任何时候我手动运行它,它都会在秒下运行。但是在生产中(SQL Azure S2 数据库),它每 12 个我们的计划任务内运行一次 - 所以我认为期望它每次都以“冷”运行是合
我正在使用quick-Json在我的程序中序列化 HashMap(String, String[]) ,但我在反序列化该对象时遇到问题。我使用此代码来序列化 map JsonGenerator
是的,我知道这个问题在技术上将是“开放式的”,并且可能会“引起辩论”,但请记住,我并不是在这里询问方向,我只是想确保我在右场。所以,话虽这么说,这是我的问题: 我想创建一个程序,允许用户输入并存储 1
我想拦截Qt Quick事件,比如key events ,这样我就可以在它们到达当前目标之前处理它们,例如当前的 focused item ,可选择阻止事件在默认事件链中传播。可以通过QML代码处理事
我是一名优秀的程序员,十分优秀!