在Julia中使用`\`而不是`/`
对于标量,在Julia中使用`\`而不是`/`,julia,Julia,对于标量,\(求解线性系统)运算符等价于除法运算符/。性能相似吗 我这样问是因为目前我的代码有一行 x = (1 / alpha) * averylongfunctionname(input1, input2, input3) 从视觉上看,alpha的除法发生在“左侧”是很重要的,因此我正在考虑用 x = alpha \ averylongfunctionname(input1, input2, input3) 从风格和性能的角度来看,这种情况下的最佳做法是什么? 以下是一些令人困惑的基准测
\
(求解线性系统)运算符等价于除法运算符/
。性能相似吗
我这样问是因为目前我的代码有一行
x = (1 / alpha) * averylongfunctionname(input1, input2, input3)
从视觉上看,alpha
的除法发生在“左侧”是很重要的,因此我正在考虑用
x = alpha \ averylongfunctionname(input1, input2, input3)
从风格和性能的角度来看,这种情况下的最佳做法是什么?
以下是一些令人困惑的基准测试结果:
julia> using BenchmarkTools
[ Info: Precompiling BenchmarkTools [6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf]
julia> @btime x[1]\sum(x) setup=(x=rand(100))
15.014 ns (0 allocations: 0 bytes)
56.23358979466163
julia> @btime (1/x[1]) * sum(x) setup=(x=rand(100))
13.312 ns (0 allocations: 0 bytes)
257.4552413802698
julia> @btime sum(x)/x[1] setup=(x=rand(100))
14.929 ns (0 allocations: 0 bytes)
46.25209548841374
它们都差不多,但是我很惊讶(1/x)*foo方法有最好的性能
我不知道,但我可以建议您尝试使用基准测试工具
软件包:它可以帮助您评估这两种软件的性能
不同的说法。你可以找到更多的细节。再见
我认为最好的选择是(1/x)*foo
,原因有二:
它有最好的性能(尽管与其他的相比不是很多)李>
对于阅读代码的另一个人来说,这更清楚
标量/
和\
实际上应该具有相同的含义和性能。让我们定义这两个测试函数:
f(a, b) = a / b
g(a, b) = b \ a
然后,我们可以看到它们生成相同的LLVM代码:
julia> @code_llvm f(1.5, 2.5)
; @ REPL[29]:1 within `f'
define double @julia_f_380(double %0, double %1) {
top:
; ┌ @ float.jl:335 within `/'
%2 = fdiv double %0, %1
; └
ret double %2
}
julia> @code_llvm g(1.5, 2.5)
; @ REPL[30]:1 within `g'
define double @julia_g_382(double %0, double %1) {
top:
; ┌ @ operators.jl:579 within `\'
; │┌ @ float.jl:335 within `/'
%2 = fdiv double %0, %1
; └└
ret double %2
}
还有同样的机器代码。我不确定是什么导致了@btime
结果的差异,但我非常确定/
和\
之间的差异是一种幻觉,而不是真实的
至于x*(1/y)
,其计算结果与x/y
不同:由于在计算1/y
时进行了舍入,然后舍入值乘以x
,这也会进行舍入,因此可能会降低精度。例如:
julia> 17/0.7
24.28571428571429
julia> 17*(1/0.7)
24.285714285714285
由于浮点除法可以保证正确的四舍五入,所以直接除法总是更精确。但是,如果许多循环迭代都使用除数,则可以通过这样重写计算来获得加速,因为浮点乘法通常比除法快(尽管我当前的计算机没有显示这种情况)。但是,请注意,这会导致精度损失,如果除数不共享,则仍然会导致精度损失,并且不会带来性能提升。谢谢。关于风格的问题,你有什么想法吗?我有点喜欢使用alpha\(更长的表达)
,但有些人可能会觉得它令人困惑,所以它似乎有点主观。我会说,如果你喜欢它并发现它更清晰,就使用它。