Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 乘以0.5而不是除以2_C - Fatal编程技术网

C 乘以0.5而不是除以2

C 乘以0.5而不是除以2,c,C,当我阅读C语言的提示时,我在这里看到了这个提示 但我不确定。有人告诉我乘法和除法都比较慢而且耗时,而且需要很多周期 我也看到人们经常使用I确实有些(如果不是大多数的话)处理器的乘法速度比除法运算快,但是,这就像在for循环中++I比I++快的神话一样。是的,它曾经是,但现在,编译器足够聪明,可以为您优化所有这些东西,所以您不应该再关心这些了 关于位移位,它曾经更快地移位,我发现这项服务对于测试这类东西是非常宝贵的: 看看最后的组装。99%的情况下,您会看到编译器将所有代码优化为相同的代码。不要

当我阅读C语言的提示时,我在这里看到了这个提示 但我不确定。有人告诉我乘法和除法都比较慢而且耗时,而且需要很多周期

我也看到人们经常使用
I确实有些(如果不是大多数的话)处理器的乘法速度比除法运算快,但是,这就像在for循环中
++I
I++
快的神话一样。是的,它曾经是,但现在,编译器足够聪明,可以为您优化所有这些东西,所以您不应该再关心这些了


关于位移位,它曾经更快地移位
,我发现这项服务对于测试这类东西是非常宝贵的:

看看最后的组装。99%的情况下,您会看到编译器将所有代码优化为相同的代码。不要浪费脑力


在某些情况下,最好显式地编写它。例如,
2^n
(其中n是正整数)可以写为
(int)pow(2.0,n)
,但使用
1显然更好许多CPU可以在1或2个时钟周期内执行乘法,但除法总是需要更长的时间(尽管FP除法有时比整数除法更快)

如果你看这个答案,你会发现除法可以超过24个周期


为什么除法比乘法要花这么长的时间?如果你记得上小学的时候,你可能还记得乘法基本上可以通过许多同时进行的加法来实现。除法需要迭代减法,不能同时执行,因此需要更长的时间。事实上,一些FP单元通过执行倒数近似并乘以它来加速除法。它不是很精确,但速度要快一些。

如果您使用整数,并且希望得到一个整数,最好使用
/2
,这样可以避免不必要的浮点转换

  • “乘以0.5而不是除以2”(2.0)在比以前更少的环境中速度更快,这主要是因为改进了编译器,可以优化代码


  • “使用i
    i*0.5
    并不总是与
    i/2
    相同(如果
    i
    int
    ,则除法是整数而不是浮点)您应该清楚地编写代码(
    i*4
    i/2
    )首先,打开编译器优化。编译器非常擅长这些优化。如果分析显示性能瓶颈,并且您选择了更好的算法和数据结构,那么只有开始尝试和测试这些微优化。这样可以更有效地利用您的时间。没有应用这些优化的一个地方是使用非常量执行整数div/mod/mul。教这些手动优化仍然有一定的价值。FP math通常也不会执行这些优化,除非编译器启用了不安全的优化。据我所知,没有处理器在1个周期内执行乘法(源代码:)。(然而,4的乘法可能会被编译器优化为移位)@harold:延迟可能大于1个周期,但在大多数现代CPU上,吞吐量应该是1个周期/倍数……神话是真的:++i比i++快,至少当i是一个复杂对象时。引用cppreference.com:因为对象的临时副本是在后增量和后减量期间构造的,所以在不使用返回值的上下文中,预增量或预减量运算符通常更有效"。我想看看最近的一个编译器,它在检测到从未使用过临时值后,还没有足够的智能来优化它。@PixelLiff虽然这是一个C问题。如果您使用整数,并且希望得到一个整数,
    >1
    优于
    /2
    。编译器无法将后者替换为前者,因为对于负数,它们是不等价的(除非结果是整数,程序员知道但编译器可能无法推断)@PascalCuoq没错,但是如果你使用的是
    无符号int
    s,差别就消失了,原因很明显。如果你使用的是有符号
    int
    s,你可能不希望负数有不正确的行为。如果你“期望得到一个整数”就没有问题了@PascalCuoq啊,我明白你的意思了(一开始我没有理解,因为,当然,结果总是得到一个整数!)
    address = x + (y << 8) + (y << 6)
    
    address = x + y * 320;