首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在julia中,宏总是比函数快吗?

在julia中,宏总是比函数快吗?
EN

Stack Overflow用户
提问于 2018-09-28 04:49:04
回答 1查看 142关注 0票数 0

我感兴趣的是传递一个简单函数的值(在下面的最小示例中为2)。我的最小示例显示,宏比函数快得多。这是对的,还是我做错了?

代码语言:javascript
复制
using BenchmarkTools
macro func!(arg)
    arg = eval(arg)
    for i in 1:length(arg)
        arg[i] = 2
    end
    return nothing
end
function func!(arg)
    for i in 1:length(arg)
        arg[i] = 2
    end
    return nothing
end
x = ones(10^3)
@btime @func!(x) --> 0.001 ns (0 allocations: 0 bytes)
@btime func!(x) --> 332.272 ns (0 allocations: 0 bytes)

EDIT1:

不,它不是更快。似乎@btime和@time宏不能与宏一起工作。在下面的最小示例中,我用@time宏验证了这一点。我计算了宏的秒数,即使@time告诉我它几乎不用时间。

代码语言:javascript
复制
x = ones(10^7)
@time @func!(x) --> 0.000001 seconds (3 allocations: 144 bytes)
@time func!(x) --> 0.007362 seconds (4 allocations: 160 bytes)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-28 05:21:56

和上一次一样,这里有两个评论。

宏实际上更慢。

考虑下面的代码,它计算宏和函数完成其工作所需的实际时间:

代码语言:javascript
复制
julia> x = ones(10^8);

julia> t1 = time_ns()
0x00006937ba4da19e

julia> @func!(x)

julia> t2 = time_ns()
0x00006939ebcb5c41

julia> Int(t2 - t1)
9420257955

julia>

julia> x = ones(10^8);

julia> t1 = time_ns()
0x0000693a0ee9452f

julia> func!(x)

julia> t2 = time_ns()
0x0000693a16ea941e

julia> Int(t2 - t1)
134303471

你会发现这个函数的速度要快得多。不同之处在于,时间是在不同的时刻消耗的(编译时与运行时,而@btime测量运行时)。

只有在全局范围内定义宏的参数时,该宏才起作用

例如,以下代码失败:

代码语言:javascript
复制
julia> function test()
           abc = [1,2,3]
           @func!(abc)
           abc
       end
ERROR: LoadError: UndefVarError: abc not defined

而:

代码语言:javascript
复制
julia> function test()
           abc = [1,2,3]
           func!(abc)
           abc
       end
test (generic function with 1 method)

julia> test()
3-element Array{Int64,1}:
 2
 2
 2

所以函数和宏实际上做的是不同的事情。

一般来说,我通常建议不要使用宏,除非有很强的理由这样做。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52544914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档