在C/C++中,您可以设置以下代码:
double a, b, c;
...
c = (a + b) / 2;
Run Code Online (Sandbox Code Playgroud)
这与以下内容完全相同:
c = (a + b) * 0.5;
Run Code Online (Sandbox Code Playgroud)
我想知道哪个更好用.一项业务从根本上比另一项更快吗?
是否确定现在scipy.misc.comb确实比特别实施更快?
根据一个旧的答案,统计:Python中的组合,这个自制函数比scipy.misc.comb计算组合时更快nCr:
def choose(n, k):
"""
A fast way to calculate binomial coefficients by Andrew Dalke (contrib).
"""
if 0 <= k <= n:
ntok = 1
ktok = 1
for t in xrange(1, min(k, n - k) + 1):
ntok *= n
ktok *= t
n -= 1
return ntok // ktok
else:
return 0
Run Code Online (Sandbox Code Playgroud)
但是在我自己的机器上运行一些测试后,使用这个脚本似乎不是这样的:
from scipy.misc import comb
import random, time
def choose(n, k):
"""
A fast way to …Run Code Online (Sandbox Code Playgroud) 处理double数据类型时,乘以更好还是更差?
哪种方式更快?哪种方式使用更少的内存?哪种方式更受欢迎?
MSIL如何处理这个?
SquareInches = MMSquared / 645.16
SquareInches = MMSquared * 0.0015500031000062000124000248000496
Run Code Online (Sandbox Code Playgroud)
注意: 10K用户会注意到这个问题的副本已被删除,因为原问题提问者决定在问题的"评论"部分指责每个人.
这个问题被重新发布,因为这是一个"好"的问题.
请"取消选中"社区Wiki以获取您的答案,因为我只是将其作为CW发布,因此它不被视为"声誉"抓取.
为了与DRY原则保持一致,一旦我重复特定模式超过一次或两次,我会尝试使用部分.因此,我的一些观点包含十个或更多不同的部分.我担心这可能会对整体表现产生负面影响.一些编程书籍将部分的使用与方法的使用进行了比较.那么我应该使用相同的理由来确定何时使用它们?
关于Rails项目中部分的大小和数量的最佳实践是什么?
哪个版本更快?
x * 0.5
or
x / 2
我不久前在大学开了一门叫做计算机系统的课程.从那时起,我记得用相对"简单"的逻辑门可以实现两个值的乘法,但是除法不是"本机"操作,并且需要一个在除数中增加的并且与被除数相比的和的寄存器.
现在我必须优化一个有很多划分的算法.不幸的是,它不仅仅是除以二,所以二元移位是没有选择的.将所有分区改为乘法会有所不同吗?
更新:
我已经改变了我的代码而没有发现任何差异.你可能正确的编译器优化.由于所有的答案都非常好,所以我对它们进行了全面的投票.我选择rahul的答案是因为它有很好的联系.
如果必须计算给定int值的一小部分,请说:
int j = 78;
int i = 5* j / 4;
Run Code Online (Sandbox Code Playgroud)
这比做的更快:
int i = 1.25*j; // ?
Run Code Online (Sandbox Code Playgroud)
如果是,是否存在可用于决定使用哪个转换因子的转换因子,例如int可以在同一时间内进行多次除法一次float乘法?
编辑:我认为评论清楚表明浮点数学会慢一点,但问题是,多少?如果我需要float用$ N $ intdiv 替换每个乘法,那么$ N $将不再值得吗?
我有一个数字(64位int),并想知道它是否是10的纯函数.也就是说,1跟随0或0以上的零.有没有一种有效的方法来做到这一点,而不涉及将其变成一个字符串?
目前我这样做:
科特林
fun isPowerOf10(n: Long): Boolean {
val logN = Math.log10(myInt.toDouble())
return logN != Math.floor(logN)
}
Run Code Online (Sandbox Code Playgroud)
Java的
static boolean isPowerOf10(long n) {
double logN = Math.log10((double) myInt);
return logN != Math.floor(logN);
}
Run Code Online (Sandbox Code Playgroud)
但它失败了isPowerOf10(999_999_999_999_999_999)(和负面版本),因为在转换为double并且log10正确输出时精度损失18.0.
可能重复:
我应该使用乘法还是除法?
比较乘法和除法
分裂比C++中的乘法更昂贵吗?
我正在进行优化,我可以将B/alpha_B变成B*alpha_A,原因有些比较.如果我选择乘法或除法,我现在可以选择吗?
我遇到过这个向量/标量划分实现:
public static Vector2 operator /(Vector2 value1, float divider)
{
float factor = 1 / divider;
value1.X *= factor;
value1.Y *= factor;
return value1;
}
Run Code Online (Sandbox Code Playgroud)
我尝试通过简单的divison实现它:
public static Vector2 operator /(Vector2 value1, float divider)
{
return new Vector2(value1.X / divider, value1.Y / divider);
}
Run Code Online (Sandbox Code Playgroud)
我尝试运行模拟,结果似乎略有不同.
这是一种提高计算精度的技巧吗?
我知道之前已经回答过类似的问题,但我找不到的答案都不是针对.NET的.
VB.NET编译器是否优化了以下表达式:
x = y / 4
Run Code Online (Sandbox Code Playgroud)
通过编译:
x = y * 0.25
Run Code Online (Sandbox Code Playgroud)
在任何人说不要担心差异很小之前,我已经知道但是这将会被执行很多而选择一个而不是另一个可以在总执行时间上产生有用的差异并且比更重要的更容易做重构练习.
也许我应该为那些生活在完全自由的环境中的人们提到:我不能自由地改变为另一种语言.如果我是,我可能会在Fortran中编写此代码.
我一直认为num * 0.5f和num / 2.0f是等价的,因为我认为编译器足够聪明,可以优化除法。所以今天我决定测试一下这个理论,但我发现的结果却难住了我。
给出以下示例代码:
float mul(float num) {
return num * 0.5f;
}
float div(float num) {
return num / 2.0f;
}
Run Code Online (Sandbox Code Playgroud)
x86-64 clang 和 gcc 都会生成以下汇编输出:
mul(float):
push rbp
mov rbp, rsp
movss DWORD PTR [rbp-4], xmm0
movss xmm1, DWORD PTR [rbp-4]
movss xmm0, DWORD PTR .LC0[rip]
mulss xmm0, xmm1
pop rbp
ret
div(float):
push rbp
mov rbp, rsp
movss DWORD PTR [rbp-4], xmm0
movss xmm0, DWORD PTR [rbp-4]
movss xmm1, DWORD PTR …Run Code Online (Sandbox Code Playgroud) math ×5
optimization ×5
c++ ×4
performance ×3
.net ×2
c ×2
algorithm ×1
c# ×1
combinations ×1
compilation ×1
cpu ×1
dry ×1
intrinsics ×1
java ×1
kotlin ×1
logarithm ×1
low-level ×1
partial ×1
python ×1
scipy ×1
vb.net ×1