相关疑难解决方法(0)

x86_64 - 汇编 - 循环条件和乱序

不是要求基准.

(如果是这样的话,我会自己做的.)


我的问题:

为方便起见,我倾向于避免间接/索引寻址模式.

作为替代,我经常使用立即,绝对或寄存器寻址.

代码:

; %esi has the array address. Say we iterate a doubleword (4bytes) array.
; %ecx is the array elements count
(0x98767) myloop:
    ... ;do whatever with %esi
    add $4, %esi
    dec %ecx
    jnz 0x98767;
Run Code Online (Sandbox Code Playgroud)

在这里,我们有一个序列化的组合(dec和jnz),它可以防止正常的乱序执行(依赖).

有没有办法避免/破坏dep?(我不是装配专家).

assembly loops x86-64 conditional-statements

4
推荐指数
1
解决办法
1070
查看次数

C++编译器是否识别2的幂?

我正在构建一个自定义哈希,我根据公式对字符串中的所有字母求和:

string[0] * 65536 + string[1] * 32768 + string[2] * 16384 + ...
Run Code Online (Sandbox Code Playgroud)

而且我遇到了一个问题,我是否应该将这些数字定义为int数组中的常量,如下所示:

const int MULTIPLICATION[] = {
    65536,
    32768,
    16384,
    8192,
    4096,
    2048,
    1024,
    512,
    256,
    128,
    64,
    32,
    16,
    8,
    4,
    2,
    1
}
Run Code Online (Sandbox Code Playgroud)

或者,也许我应该在计算哈希本身时生成这些数字(虽然由于它们尚未生成而可能会失去一些速度)?我需要数百万次计算这个哈希值,我希望编译器理解的主要内容是代替普通的MUL操作

MOV EBX, 8
MUL EBX
Run Code Online (Sandbox Code Playgroud)

它会的

SHL EAX, 3
Run Code Online (Sandbox Code Playgroud)

编译器是否理解如果我乘以2的幂来移位而不是通常的乘法?

另一个问题,我很确定当你用c ++编号*= 2时,它会移位.但只是为了澄清,是吗?


谢谢,我已经找到了如何在调试器中查看dissasembly.是的,如果您使用它,编译器确实理解移位

number *= 65536
Run Code Online (Sandbox Code Playgroud)

但是,如果你这样做,它会进行正常的乘法运算

number1 = 65536
number *= number1;
Run Code Online (Sandbox Code Playgroud)

c++ hash assembly

3
推荐指数
1
解决办法
614
查看次数

哪个在C++中更快:i <= N或i <N + 1

以下两个for循环都将执行N + 1次:

for(int i = 0; i <= N; ++i);
for(int i = 0; i < N + 1; ++i);
Run Code Online (Sandbox Code Playgroud)

两个表达式中的哪一个(i <= N或i <N + 1)计算速度更快?我知道有一个流行的类似问题(<快于<=?),但我认为这是不同的,因为我们在一个变量中加1,可能不是常数,然后将它与i进行比较,而不是比较它一个恒定的价值.

c++ performance for-loop

3
推荐指数
1
解决办法
127
查看次数

C++优化,使用>而不是<=

检查'<='而不是'>'是否更昂贵?

第一个检查<和==,但'>'只检查一个.

或者编译器可能会对此进行优化?

c++ optimization

2
推荐指数
1
解决办法
223
查看次数

“小于/大于”的性能是否优于“小于/大于或等于”的性能

它是计算上更高性能的比较少/大于少/大于或等于

凭直觉,人们可能认为少/多于好。

编译器可以使用一些技巧使比较看起来相同吗?

编译器可以消除例如小于或等于小于通过增加一个绑定的,但如果绑定的是“活着”,那么这不能做。

theory performance compiler-theory

2
推荐指数
1
解决办法
1141
查看次数

哪个性能更高:<= 0或<1?

回到我学习C和装配的那一天,我们被教导,最好使用简单的比较来提高速度.例如,如果你说:

if(x <= 0)
Run Code Online (Sandbox Code Playgroud)

if(x < 1)
Run Code Online (Sandbox Code Playgroud)

哪个会执行得更快?我的论点(可能是错误的)是第二个几乎总是执行得更快,因为只有一个比较)即小于一,是或否.

如果数字小于0,第一个将快速执行,因为这等于为真,没有必要检查等于使得它与第二个一样快,但是,如果数字为0或更多,它将总是更慢,因为它然后必须进行第二次比较,看它是否等于0.

我现在正在使用C#,而在开发台式机时速度不是问题(至少没有达到他的观点值得争论的程度),我仍然认为这些论点需要考虑因为我也在为移动设备开发功能不如台式机,速度确实成为这类设备的问题.

为了进一步考虑,我说的是整数(没有小数)和数字,其中不能有负数如-1或-12,345等(除非有错误),例如,当你不能处理列表或数组时有一个负数的项目,但你想检查一个列表是否为空(或如果有问题,将x的值设置为负表示错误,一个例子是列表中有一些项目,但你不能由于某种原因检索整个列表,并指出你将数字设置为负数,这与说没有项目是不一样的).

由于上述原因,我故意忽略了显而易见的事实

if(x == 0)
Run Code Online (Sandbox Code Playgroud)

if(x.isnullorempty())
Run Code Online (Sandbox Code Playgroud)

用于检测没有项目的列表的其他此类项目.

同样,为了考虑,我们讨论的是从数据库中检索项目的可能性,可能使用具有所述功能的SQL存储过程(即标准(至少在该公司中)是返回负数以指示问题).

所以在这种情况下,使用上面的第一个或第二个项目会更好吗?

c# performance

1
推荐指数
3
解决办法
544
查看次数

算术逻辑单元如何知道比较的逻辑?

我正在我的大学学习系统工具和架构课程,第一堂课是关于如何CPURAM谈话以及CPU如何处理数据.正如教授所解释的,CPU有一个ALU (Arithmetic Logic unit)执行算术,如添加和比较.但他没有解释它是如何做到的.

所以我做了一些搜索,发现这个链接指向一个youtube视频,解释了如何执行添加 - 很好地为初学者解释.甚至这个链接也解释了CPU指向算术处理ALU但不处理如何ALU执行它.

我的问题是怎么样ALUcomparison.作为人类,我们知道5小于7.但是如何ALU知道这一点,它是否在某种程度上是硬编码的.我确信它必须使用一些logic进行比较,这是什么逻辑.

很高兴知道这是如何成为CS的主要工作

architecture cpu ram logic alu

1
推荐指数
1
解决办法
1789
查看次数

哪个运算符更快:!=或>

哪个运营商更快:>==

示例:我想测试一个值(可以有一个正值或-1)对-1:

if(time > -1)
// or
if (time != -1)
Run Code Online (Sandbox Code Playgroud)

时间有类型"int"

c c++

1
推荐指数
3
解决办法
1775
查看次数

了解if(a> = 3)的gcc输出

在此输入图像描述

我认为因为条件是> = 3,我们应该使用jl(更少).

但gcc使用jle(少或相等).

这对我没有意义; 为什么编译器会这样做?

c x86 assembly gcc

-2
推荐指数
1
解决办法
131
查看次数

C#或任何其他语言如何与操作员不相等

嗨哪一个更快

            int a = 100;
        //First Way
        if (a != 100)
        {
            //Do something when a is not equal to 100
        }
        else
        {
            //Do something when a is equal to 100
        }

        //Second Way
        if (a == 100)
        {
            //Do something when a is equal to 100

        }
        else
        {
            //Do something when a is not equal to 100
        }
Run Code Online (Sandbox Code Playgroud)

我认为第二种方式更快,但我很想知道NOT EQUAL(!=)运算符是如何解决的.它是否首先实现了相等(==)操作,然后结果被否定为!(a == 100)?任何帮助都会得到很高的评价.

c# oop operators

-3
推荐指数
1
解决办法
8672
查看次数

>比=更快?

在C++中,>速度比==

a > b
Run Code Online (Sandbox Code Playgroud)

VS

a == b
Run Code Online (Sandbox Code Playgroud)

有时我想知道这个,因为也许我可以使用>而不是==,但代码不会那么清晰/可读

因为我认为==它必须比较所有数字,>只有第一个,如果需要第二个,依此类推,这是正确的,或它实际做了什么,以及哪一个是最快的运算符?

c++ performance

-3
推荐指数
1
解决办法
180
查看次数