我以前看文档时,文档里有一句话我一直记得并严格遵守:
(比起标注全局变量的类型,)一个更好的编程风格是将变量作为参数传给函数。
因此我在我编写代码时,一直不厌其烦将“光速”“元电荷量”这种常数参数写在函数定义中(刚刚我测试了一下,大概由于这里全局变量是常数,性能提升可怜巴巴)。
但是似乎非常数全局变量有些不同。
我在看这个视频时,发现全局变量标注类型后居然可以比参数传入的速度更快?
代码:
这里的
x=rand(10000)
时间比较:
其实按照我的理解,这里的函数lp3(x)
在遇到Vector{Float64}
类型时,会编译出相应数值类型的函数——这不就已经相当于一种类型标注吗?为什么速度还更慢呢?
总觉得哪里不对:如果很多人追求性能的话,就需要将函数改写成更改全局变量的形式。但是这样不是很直观,可能不是很好的代码习惯。
对于截图里的例子,由于十分简单,若想明白性能的差别可以直接查看Julia编译出来的LLVM或者汇编。
对于全局变量的处理,我的习惯是:
- 若是真常数,比如物理常数或者模型运行时基本不会变化的量,使用确定类型的全局变量(因为Julia没有“真常数”);
- 如果是模型参数,整合成一个struct类,然后把这个类的object传递给函数。
我不到啊,我也想搞清楚。搞清楚了我就给人家反馈去,让他们照着最快的改。
请问$s
是个什么用法?在文档的哪一节?我搜$
这个符号,没搜到
解决了,不是函数内部出了问题,是我参数传进去有问题。
就是 @magicly 说的$x
来传递,或者声明x=rand(10000)
变量时,用const x = rand(10000)
。但是我跑了几下,第二种比第一种快一点点。
顺便英文网站网友盖楼速度好快。
1 个赞