我可以通过哪种方式对Julia函数进行基准测试?


11

背景

我自学了机器学习,最近开始研究Julia机械学习生态系统。


来自python背景,并且具有一些Tensorflow和OpenCV / skimage经验,我想对Julia ML库(Flux / JuliaImages)进行比较,以查看其对CV(任何)任务的执行速度有多快 ,并决定是否执行我应该转向使用朱莉娅。

我知道如何使用这样的timeit模块获取在python中执行功能所花费的时间:

#Loading an Image using OpenCV

s = """\
img = cv2.imread('sample_image.png', 1)
"""
setup = """\
import timeit
"""
print(str(round((timeit.timeit(stmt = s, setup = setup, number = 1))*1000, 2)) + " ms")
#printing the time taken in ms rounded to 2 digits

如何使用适当的库(在本例中为JuliaImages)比较在Julia中执行相同任务的函数的执行时间。

朱莉娅(Julia)是否提供任何功能/宏给时间/基准?

Answers:


10

using BenchmarkTools是对Julia函数进行基准测试的推荐方法。除非您要花一些时间来安排时间,否则请使用其中一个@benchmark@btime从中导出的较为详细的宏。因为这些宏后面的机制会多次评估目标函数,@time所以对于基准测试运行缓慢的事物很有用(例如,涉及磁盘访问或非常耗时的计算)。

使用@btime@benchmark正确使用很重要,这样可以避免产生误导性的结果。通常,您正在对采用一个或多个参数的函数进行基准测试。基准测试时,所有参数都应为外部变量:(无基准宏)

x = 1
f(x)
# do not use f(1)

该功能将被评估多次。为了防止每次对函数参数求值时都重新计算函数参数,我们必须在每个参数前面加上一个前缀$用作变量的每个变量的名称前来参数。基准测试宏使用它来指示在基准测试过程开始时应对变量进行一次评估(解析),然后按原样直接重用结果:

julia> using BenchmarkTools
julia> a = 1/2;
julia> b = 1/4;
julia> c = 1/8;
julia> a, b, c
(0.5, 0.25, 0.125)

julia> function sum_cosines(x, y, z)
         return cos(x) + cos(y) + cos(z)
       end;

julia> @btime sum_cosines($a, $b, $c);  # the `;` suppresses printing the returned value
  11.899 ns (0 allocations: 0 bytes)    # calling the function takes ~12 ns (nanoseconds)
                                        # the function does not allocate any memory
# if we omit the '$', what we see is misleading
julia> @btime sum_cosines(a, b, c);    # the function appears more than twice slower 
 28.441 ns (1 allocation: 16 bytes)    # the function appears to be allocating memory
# @benchmark can be used the same way that @btime is used
julia> @benchmark sum_cosines($a,$b,$c) # do not use a ';' here
BenchmarkTools.Trial:
  memory estimate:  0 bytes
  allocs estimate:  0
  --------------
  minimum time:     12.111 ns (0.00% GC)
  median time:      12.213 ns (0.00% GC)
  mean time:        12.500 ns (0.00% GC)
  maximum time:     39.741 ns (0.00% GC)
  --------------
  samples:          1500
  evals/sample:     999

尽管有一些参数可以调整,但默认值通常效果很好。有关面向经验丰富的使用者的BenchmarkTools的其他信息,请参阅手册


7

朱莉娅提供了两个用于计时/基准测试代码运行时的。这些是 :

  • @时间
  • @benchmark:外部,通过安装Pkg.add("BenchmarkTools")

使用BenchmarkTools的@benchmark非常简单,这将有助于您比较两种语言的速度。@benchark针对您提供的python Bench 的使用示例。

using Images, FileIO, BenchmarkTools

@benchmark img = load("sample_image.png")

输出:

BenchmarkTools.Trial: 
  memory estimate:  3.39 MiB
  allocs estimate:  322
  --------------
  minimum time:     76.631 ms (0.00% GC)
  median time:      105.579 ms (0.00% GC)
  mean time:        110.319 ms (0.41% GC)
  maximum time:     209.470 ms (0.00% GC)
  --------------
  samples:          46
  evals/sample:     1

现在要比较平均时间,您应该将samples(46)作为python timeit代码中的数字并将其除以相同的数字以获得平均执行时间。

print(str(round((timeit.timeit(stmt = s, setup = setup, number = 46)/46)*1000, 2)) + " ms")

您可以按照此过程对Julia和Python中的任何函数进行基准测试。希望您的疑虑已经解决。


注意从统计角度来看,@ benchmark比@time更好。


2
请注意,定时噪声大部分为正,这意味着最短时间通常(并非总是)更有意义。@btime并且@belapsed仅返回最短时间。
Fredrik Bagge
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.