Ritu Lahkar Asked: 2024-08-22 09:13:28 +0800 CST2024-08-22 09:13:28 +0800 CST 2024-08-22 09:13:28 +0800 CST 在 julia 中,a >= b && c <= b vs !(a<b || c>b) 哪个性能更高 772 a >= b && c <= b vs !( a < b || c > b) julia 中哪个性能更高? julia 2 个回答 Voted GKi 2024-08-22T22:24:49+08:002024-08-22T22:24:49+08:00 就我而言,生成的代码是相同的。 @code_native ((a,b,c)->a >= b && c <= b)(1,2,3) .text .file "#1" .globl "julia_#1_61" # -- Begin function julia_#1_61 .p2align 4, 0x90 .type "julia_#1_61",@function "julia_#1_61": # @"julia_#1_61" ; ┌ @ REPL[1]:1 within `#1` # %bb.0: # %top push rbp mov rbp, rsp ; │┌ @ operators.jl:425 within `>=` ; ││┌ @ int.jl:514 within `<=` cmp rsi, rdi setle cl ; │└└ cmp rdx, rsi setle al and al, cl ; │┌ @ int.jl:514 within `<=` pop rbp ret .Lfunc_end0: .size "julia_#1_61", .Lfunc_end0-"julia_#1_61" ; └└ # -- End function .section ".note.GNU-stack","",@progbits @code_native ((a,b,c)->!( a < b || c > b))(1,2,3) .text .file "#3" .globl "julia_#3_87" # -- Begin function julia_#3_87 .p2align 4, 0x90 .type "julia_#3_87",@function "julia_#3_87": # @"julia_#3_87" ; ┌ @ REPL[2]:1 within `#3` # %bb.0: # %top push rbp mov rbp, rsp ; │┌ @ int.jl:83 within `<` cmp rdi, rsi setge cl ; │└ cmp rsi, rdx setge al and al, cl ; │┌ @ bool.jl:35 within `!` pop rbp ret .Lfunc_end0: .size "julia_#3_87", .Lfunc_end0-"julia_#3_87" ; └└ # -- End function .section ".note.GNU-stack","",@progbits Best Answer Martin Brown 2024-08-22T16:46:17+08:002024-08-22T16:46:17+08:00 如果逐字逐句地按面值进行评估,执行时间的差异将太小而无法衡量。最有可能的是,它会将它们转换为相同的可执行代码。我还没有检查过这一点。这种微优化毫无意义。您可以尝试自己进行测量并尝试证明我错了(如果您提供了基准,您可能不会吸引负面投票)。 编译器很可能会将这两个表达式中的任何一个转换为它认为最方便评估其所处理的数据类型的规范形式。 对于整数,a,b我的猜测是使用的表达式&&至少在 x86 系列 CPU 上具有优势,因为TEST指令的硬件支持避免了写周期。 就 CPU 而言,所有比较标志都是在比较操作之后设置的,因此对于>vs不会有任何惩罚<=,条件分支是否会根据a和的值来采取b。 PS 你应该首先追求清晰和正确。如果算法实现明显太慢,那么只有这样才能使用分析来找到热点。过早的优化会浪费太多时间。
就我而言,生成的代码是相同的。
如果逐字逐句地按面值进行评估,执行时间的差异将太小而无法衡量。最有可能的是,它会将它们转换为相同的可执行代码。我还没有检查过这一点。这种微优化毫无意义。您可以尝试自己进行测量并尝试证明我错了(如果您提供了基准,您可能不会吸引负面投票)。
编译器很可能会将这两个表达式中的任何一个转换为它认为最方便评估其所处理的数据类型的规范形式。
对于整数,
a,b
我的猜测是使用的表达式&&
至少在 x86 系列 CPU 上具有优势,因为TEST
指令的硬件支持避免了写周期。就 CPU 而言,所有比较标志都是在比较操作之后设置的,因此对于
>
vs不会有任何惩罚<=
,条件分支是否会根据a
和的值来采取b
。PS 你应该首先追求清晰和正确。如果算法实现明显太慢,那么只有这样才能使用分析来找到热点。过早的优化会浪费太多时间。