如果两者都转换为机器代码,汇编如何比编译语言更快?
我说的是真正编译的语言,它们被翻译成机器代码.不是C#或Java,它们首先被编译为中间语言,然后由软件解释器等编译为本机代码.
在维基百科上,我找到了一些我不确定它是否与此相关的东西.是因为从更高级别的语言翻译会产生额外的机器代码吗?或者我的理解错了吗?
称为汇编程序的实用程序用于将汇编语言语句转换为目标计算机的机器代码.汇编程序从助记语句到机器指令和数据执行或多或少的同构转换(一对一映射).这与高级语言形成对比,在高级语言中,单个语句通常会产生许多机器指令.
我正在编写一个性能关键,数字运算的C++项目,其中70%的时间用于200线核心模块.
我想使用内联汇编来优化内核,但我对此完全陌生.但是,我知道一些x86汇编语言,包括GCC和NASM使用的语言.
据我所知:
我必须将汇编程序指令放在_asm{}我想要的位置.
问题:
c++ inline-assembly visual-studio-2010 micro-optimization visual-c++
我愿意编写一个代码,让我的CPU执行一些操作,看看他花了多少时间来解决它们.我想做一个从i = 0到i <5000的循环,然后将i乘以一个常数和时间.我最终得到了这个代码,它没有错误,但即使我更改循环i <49058349083或者如果i <2它需要相同的时间,它只需要0.024秒来执行代码.是什么错误?
PD:我昨天开始学习C++我很抱歉,如果这是一个非常容易回答的问题,但我找不到解决方案
#include <iostream>
#include <ctime>
using namespace std;
int main () {
int start_s=clock();
int i;
for(i=0;i<5000;i++){
i*434243;
}
int stop_s=clock();
cout << "time: "<< (stop_s-start_s)/double(CLOCKS_PER_SEC)*1000;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在做CSAPP的datalab,即isGreater功能.
这是描述
isGreater - if x > y then return 1, else return 0
Example: isGreater(4,5) = 0, isGreater(5,4) = 1
Legal ops: ! ~ & ^ | + << >>
Max ops: 24
Rating: 3
Run Code Online (Sandbox Code Playgroud)
x和y都是int类型.
所以,我认为模拟JG指令,以实现it.Here是我的代码
int isGreater(int x, int y)
{
int yComplement = ~y + 1;
int minusResult = x + yComplement; // 0xffffffff
int SF = (minusResult >> 31) & 0x1; // 1
int ZF = !minusResult; // 0
int xSign = (x >> 31) …Run Code Online (Sandbox Code Playgroud) 我对性能计算的C语言感兴趣.您能推荐一些具有以下属性的替代编程语言:
我主要对鲜为人知的语言感兴趣.
我有一个32位数字,想知道有多少位是1.
我在考虑这个伪代码:
mov eax, [number]
while(eax != 0)
{
div eax, 2
if(edx == 1)
{
ecx++;
}
shr eax, 1
}
Run Code Online (Sandbox Code Playgroud)
有更有效的方法吗?
我在x86处理器上使用NASM.
(我刚开始使用汇编程序,所以请不要告诉我使用extern库中的代码,因为我甚至不知道如何包含它们;))
(我刚刚发现如何计算32位整数中的设置位数?这也包含我的解决方案.还有其他解决方案,但不幸的是我似乎无法弄清楚,我将如何在汇编程序中编写它们)
如何有效地计算128位整数(uint128_t)中前导零的数量?
我知道GCC的内置功能:
__builtin_clz,__builtin_clzl,__builtin_clzll__builtin_ffs,__builtin_ffsl,__builtin_ffsll但是,这些函数仅适用于32位和64位整数.
我还发现了一些SSE指令:
__lzcnt16,__lzcnt,__lzcnt64正如您可能猜到的,这些仅适用于16位,32位和64位整数.
128位整数是否有类似的,高效的内置功能?
这可能是一个非常菜鸟的问题,我什至不确定这是否是提问的正确论坛,但请耐心等待,如果不是,请给我一个正确的方向。
我一直听到这个词到处乱说,但我仍然不太确定我知道它的意思。手动优化代码意味着什么?我在网上搜索过,但找不到它的正式定义,stackexchange 或其他。
对于某些上下文,例如摘自维基百科关于程序优化的文章:
在最低层次上,如果程序员充分利用机器指令的全部功能,使用专为特定硬件平台设计的汇编语言编写代码可以生成最高效、最紧凑的代码。出于这个原因,嵌入式系统上使用的许多操作系统传统上都是用汇编代码编写的。由于涉及时间和成本,程序(除了非常小的程序)很少在汇编中从头到尾编写。大多数都是从高级语言编译为汇编并从那里进行手工优化。当效率和尺寸不太重要时,大型部件可能会用高级语言编写。
根据上下文,我假设这意味着“手动编辑机器代码以优化算法”或类似的东西。但是我仍然很困惑,因为我听说过在非汇编语言(例如 C++ 和 Java)的上下文中也使用了这个术语。
我在llvm clang Apple LLVM 8.0.0版(clang-800.0.42.1)上反汇编代码:
int main() {
float a=0.151234;
float b=0.2;
float c=a+b;
printf("%f", c);
}
Run Code Online (Sandbox Code Playgroud)
我编译时没有-O规范,但我也试过-O0(给出相同)和-O2(实际上计算值并存储它预先计算)
产生的反汇编如下(我删除了不相关的部分)
-> 0x100000f30 <+0>: pushq %rbp
0x100000f31 <+1>: movq %rsp, %rbp
0x100000f34 <+4>: subq $0x10, %rsp
0x100000f38 <+8>: leaq 0x6d(%rip), %rdi
0x100000f3f <+15>: movss 0x5d(%rip), %xmm0
0x100000f47 <+23>: movss 0x59(%rip), %xmm1
0x100000f4f <+31>: movss %xmm1, -0x4(%rbp)
0x100000f54 <+36>: movss %xmm0, -0x8(%rbp)
0x100000f59 <+41>: movss -0x4(%rbp), %xmm0
0x100000f5e <+46>: addss -0x8(%rbp), %xmm0
0x100000f63 <+51>: movss %xmm0, -0xc(%rbp)
...
Run Code Online (Sandbox Code Playgroud)
显然它正在做以下事情:
我正在寻找相关的性能指标来基准测试和优化我的C / C ++代码。例如,虚拟内存使用率是一个简单但有效的指标,但是我知道有些虚拟内存使用情况更为专业,可以帮助优化特定域:高速缓存命中/未命中,上下文切换等。
我相信这里是一个列出性能指标,衡量指标以及如何衡量指标的好地方,以帮助希望开始优化程序的人员知道从何开始。
assembly ×5
c++ ×3
performance ×3
benchmarking ×2
c ×2
optimization ×2
cpu ×1
eflags ×1
gcc ×1
instructions ×1
llvm-codegen ×1
low-level ×1
nasm ×1
profiling ×1
semantics ×1
sse ×1
visual-c++ ×1
x86 ×1
x86-64 ×1