- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Apparently ,现代处理器可以判断您是否做了一些愚蠢的事情,例如将寄存器移动到自身 ( mov %eax, %eax
) 并将其优化。为了验证该声明,我运行了以下程序:
#include <stdio.h>
#include <time.h>
static inline void f1() {
for (int i = 0; i < 100000000; i++)
__asm__(
"mov %eax, %eax;"
"nop;"
);
}
static inline void f2() {
for (int i = 0; i < 100000000; i++)
__asm__(
"nop;"
);
}
static inline void f3() {
for (int i = 0; i < 100000000; i++)
__asm__(
"mov %ebx, %eax;"
"nop;"
);
}
int main() {
int NRUNS = 10;
clock_t t, t1, t2, t3;
t1 = t2 = t3 = 0;
for (int run = 0; run < NRUNS; run++) {
t = clock(); f1(); t1 += clock()-t;
t = clock(); f2(); t2 += clock()-t;
t = clock(); f3(); t3 += clock()-t;
}
printf("f1() took %f cycles on avg\n", (float) t1/ (float) NRUNS);
printf("f2() took %f cycles on avg\n", (float) t2/ (float) NRUNS);
printf("f3() took %f cycles on avg\n", (float) t3/ (float) NRUNS);
return 0;
}
f1() took 175587.093750 cycles on avg
f2() took 188313.906250 cycles on avg
f3() took 194654.296875 cycles on avg
f3()
出来最慢。但令人惊讶的是(至少对我而言),
f1()
比
f2()
快.这是为什么?
-falign-loops
定性地给出相同的结果:
f1() took 164271.000000 cycles on avg
f2() took 173783.296875 cycles on avg
f3() took 177765.203125 cycles on avg
最佳答案
The part of the linked article that made me think that this can be optimized away is: "the move function takes care of checking for equivalent locations"
(move r x)
SBCL 中的函数,而不是 x86
mov
操作说明。它谈论的是从低级中间语言生成代码期间的优化,而不是硬件在运行时的优化。
mov %eax, %eax
也不是
nop
完全免费。它们都消耗前端吞吐量,并且
mov %eax,%eax
在 64 位模式下甚至不是 NOP(它将 EAX 零扩展到 RAX,并且因为它是相同的寄存器,所以在 Intel CPU 上移动消除失败。)
mov %ebx, %eax;
f3
中的错误在启用优化的情况下成功编译。在不告诉编译器的情况下破坏 EAX 将踩到编译器生成的代码。你没有解释你试图用它测试什么,所以 IDK 如果它是一个错字。
关于gcc - 为什么 `mov %eax, %eax; nop` 比 `nop` 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52992723/
我在 C++ 中使用 rdtsc 为多个 NOP 指令和单个 NOP 指令计时.但是,我没有发现执行 NOP 所需的周期数与执行的 NOP 数量成正比。我很困惑为什么会这样。我的 CPU 是 Inte
有人知道有任何在线资源可以提供 NOP 操作码的指令替代吗? 例如“xchg axe,ax”之类的。我很确定也有一个工具,有人可以给我指出那个方向吗? 最佳答案 一些 shellcode 引擎包含 n
Apparently ,现代处理器可以判断您是否做了一些愚蠢的事情,例如将寄存器移动到自身 ( mov %eax, %eax ) 并将其优化。为了验证该声明,我运行了以下程序: #include #
在 Windows 中,是否可以将 __asm nop 换成 asm volatile("nop");(在 GCC 编译器中使用)并产生相同的结果? 我读过 volatile()(在 GCC 中)保证
从我通常的 VC++ 领域冒险进入 GCC 的世界(通过 MINGW32)。试图创建一个主要由 NOP 组成的 Windows PE,ala: for(i = 0; i < 1000; i++) {
我想在 linux 内核模块中实现非忙等待机制以创建纳秒级延迟。 现在我正在看函数 ndelay(ns); 但是https://www.kernel.org/doc/Documentation/tim
我使用 ILGenerator 生成一些 IL,这是我的代码: DynamicMethod method = new DynamicMethod("test", null, Type.EmptyTyp
想知道空表达式的计算结果是否为 NOP 或者它是否依赖于编译器。 // Trivial example int main() { ;; } 最佳答案 它依赖于编译器,但可观察到的行为必须是没有
我找不到一个很好的来源来回答这个问题。我知道 nop sled 是一种用于在缓冲区溢出攻击中规避堆栈随机化的技术,但我无法理解它是如何工作的。 说明此方法的简单示例是什么? 128 字节 nop sl
当我用 Visual Studio 编写 C/C++ 时,我经常使用 __asm nop; 命令插入 noop 代码,以便有一些东西可以中断。例如: if (someCondition()) {
我偶然发现了这个,我有点困惑。 我有一个现成的VS 2010 F#项目,具有所有默认设置,目标是.NET 4.0。 F#代码如下所示: let test(a:int, b:int, c:int) =
我想知道汇编中的“语义 NOP”是什么? 最佳答案 代码不是实际的 nop,但不会影响程序的行为。 在 C 语言中,以下序列可以被视为语义 NOP: { // Since none of th
我正在查看 MSIL 并注意到有很多 nop MSIL 中的说明。 MSDN 文章称,如果操作码被修补,它们不会采取任何操作,而是用于填充空间。它们在调试版本中的使用比发布版本中的使用要多得多。 我知
我正在 VS2010 beta2 中使用 F#,由于我是 F# 新手,我只是选择了一个常见示例,然后继续实现阶乘函数,如下所示: let rec factorial n = if n <= 1 t
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在编写一个程序来确定每秒可以运行多少个 NOP,但我得到的数字似乎非常小。 int main() { struct timeval tvStart, tvDiff, tvEnd;
我正在开发 nop 商业商店 (3.50)。我有一个要求,当用户点击我的信息网站上提供的链接时,他将被重定向到 nop 商务网站。我想将登录的用户信息从该站点传递到 nop commerce stor
我编写了一个基本代码来找出 nop 占用的时钟周期数。我们知道 nop 需要一个时钟周期。 #include #include #include int main(void) { uin
嗨,这是我的第一个问题,所以请温和地对待我。我正在使用 MS detours 和 Visual Studio 2005 绕过一个 exe,我的 dll 被加载并且我的钩子(Hook)工作正常但是当我尝
我正在编写一个用户空间程序,我想在某个时候“阻塞”一个线程。如果我使用类似互斥的函数,线程将被切换出处理器。我想要的是让线程保持在处理器上,而无需在低功耗状态或循环 nop 操作中涉及上下文切换。有时
我是一名优秀的程序员,十分优秀!