(如果是这样的话,我会自己做的.)
我的问题:
为方便起见,我倾向于避免间接/索引寻址模式.
作为替代,我经常使用立即,绝对或寄存器寻址.
代码:
; %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?(我不是装配专家).
我正在构建一个自定义哈希,我根据公式对字符串中的所有字母求和:
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) 以下两个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和装配的那一天,我们被教导,最好使用简单的比较来提高速度.例如,如果你说:
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存储过程(即标准(至少在该公司中)是返回负数以指示问题).
所以在这种情况下,使用上面的第一个或第二个项目会更好吗?
我正在我的大学学习系统工具和架构课程,第一堂课是关于如何CPU和RAM谈话以及CPU如何处理数据.正如教授所解释的,CPU有一个ALU (Arithmetic Logic unit)执行算术,如添加和比较.但他没有解释它是如何做到的.
所以我做了一些搜索,发现这个链接指向一个youtube视频,解释了如何执行添加 - 很好地为初学者解释.甚至这个链接也解释了CPU指向算术处理ALU但不处理如何ALU执行它.
我的问题是怎么样ALU呢comparison.作为人类,我们知道5小于7.但是如何ALU知道这一点,它是否在某种程度上是硬编码的.我确信它必须使用一些logic进行比较,这是什么逻辑.
很高兴知道这是如何成为CS的主要工作
哪个运营商更快:>或==?
示例:我想测试一个值(可以有一个正值或-1)对-1:
if(time > -1)
// or
if (time != -1)
Run Code Online (Sandbox Code Playgroud)
时间有类型"int"
嗨哪一个更快
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++中,>速度比==?
a > b
Run Code Online (Sandbox Code Playgroud)
VS
a == b
Run Code Online (Sandbox Code Playgroud)
有时我想知道这个,因为也许我可以使用>而不是==,但代码不会那么清晰/可读
因为我认为==它必须比较所有数字,>只有第一个,如果需要第二个,依此类推,这是正确的,或它实际做了什么,以及哪一个是最快的运算符?