全局变量该如何传给函数比较好?

我以前看文档时,文档里有一句话我一直记得并严格遵守:

(比起标注全局变量的类型,)一个更好的编程风格是将变量作为参数传给函数。

因此我在我编写代码时,一直不厌其烦将“光速”“元电荷量”这种常数参数写在函数定义中(刚刚我测试了一下,大概由于这里全局变量是常数,性能提升可怜巴巴)。


但是似乎非常数全局变量有些不同。

我在看这个视频时,发现全局变量标注类型后居然可以比参数传入的速度更快?

代码:


这里的x=rand(10000)

时间比较:

其实按照我的理解,这里的函数lp3(x)在遇到Vector{Float64}类型时,会编译出相应数值类型的函数——这不就已经相当于一种类型标注吗?为什么速度还更慢呢?

  1. 常数不建议作为参数
  2. (标记:)1.8 以后全局变量可以进行类型标注,一定程度提速
  3. 这个例子,个人推测 lp2 被大幅优化了,具体还是得看被编译成什么样

总觉得哪里不对:如果很多人追求性能的话,就需要将函数改写成更改全局变量的形式。但是这样不是很直观,可能不是很好的代码习惯。

对于截图里的例子,由于十分简单,若想明白性能的差别可以直接查看Julia编译出来的LLVM或者汇编。

对于全局变量的处理,我的习惯是:

  1. 若是真常数,比如物理常数或者模型运行时基本不会变化的量,使用确定类型的全局变量(因为Julia没有“真常数”);
  2. 如果是模型参数,整合成一个struct类,然后把这个类的object传递给函数。

@benchmark lp3($x)

做benchmark的时候, 参数要这样传递才准

2 个赞

这个是什么原理呢?

你好,请问在哪个文件夹下查看啊?

我不到啊,我也想搞清楚。搞清楚了我就给人家反馈去,让他们照着最快的改。

请问$s是个什么用法?在文档的哪一节?我搜$这个符号,没搜到

https://juliaci.github.io/BenchmarkTools.jl/stable/

1 个赞

解决了,不是函数内部出了问题,是我参数传进去有问题。

就是 @magicly 说的$x来传递,或者声明x=rand(10000)变量时,用const x = rand(10000)。但是我跑了几下,第二种比第一种快一点点。

顺便英文网站网友盖楼速度好快。

1 个赞

补充,快得都吵起来了。还是国内论坛和谐

在这里

Manual · BenchmarkTools.jl (juliaci.github.io)

@vavrines

2 个赞