julia: 嵌套函数是否更慢?
julia: Are nested functions slower?
当我编写代码时,我可以看到一个函数中的重复部分,但在其他函数中没有使用。
所以,我想让重复部分发挥作用。
但是嵌套函数会比较慢吗?我在 julia 文档的性能提示中找不到这个。
Bogumil 在评论中大致回答了这个问题。只是为了了解内联的工作原理,您可以做这个小实验。定义以下 f
和 g
函数。
f(x) = x*x
function g(a,b)
a+f(b)
end
现在让我们看看编译器对它们做了什么:
julia> @code_typed g(3,4)
CodeInfo(
1 ─ %1 = Base.mul_int(b, b)::Int64
│ %2 = Base.add_int(a, %1)::Int64
└── return %2
) => Int64
可以看到函数f
的调用已经被内联了。
一般小的函数会内联,大的可以用@inline
宏修饰,提示编译器内联(注意这只是提示)。由于当一个函数的代码多于几行时调用它的成本很小,因此调用它不会显着影响性能。
最后但同样重要的是,用 BenchmarkTools
做自己的基准测试似乎总是一个好主意:-)
当我编写代码时,我可以看到一个函数中的重复部分,但在其他函数中没有使用。
所以,我想让重复部分发挥作用。
但是嵌套函数会比较慢吗?我在 julia 文档的性能提示中找不到这个。
Bogumil 在评论中大致回答了这个问题。只是为了了解内联的工作原理,您可以做这个小实验。定义以下 f
和 g
函数。
f(x) = x*x
function g(a,b)
a+f(b)
end
现在让我们看看编译器对它们做了什么:
julia> @code_typed g(3,4)
CodeInfo(
1 ─ %1 = Base.mul_int(b, b)::Int64
│ %2 = Base.add_int(a, %1)::Int64
└── return %2
) => Int64
可以看到函数f
的调用已经被内联了。
一般小的函数会内联,大的可以用@inline
宏修饰,提示编译器内联(注意这只是提示)。由于当一个函数的代码多于几行时调用它的成本很小,因此调用它不会显着影响性能。
最后但同样重要的是,用 BenchmarkTools
做自己的基准测试似乎总是一个好主意:-)