当前位置: 首页 > 知识库问答 >
问题:

为什么在Julia中用户定义的类型和内置的语言类型一样快速和紧凑?

夏侯瑞
2023-03-14

我已经审查了很多文档,但我找不到一个具体的答案。

Julia标准基元类型都是在语言本身中定义的,Julia允许您声明自己的基元类型,但我不知道这是否是为什么程序员定义的类型像内置类型一样快速和紧凑的原因。我甚至检查了GitHub上的源代码,更具体地说是bool.jl,这是定义int等数值类型的地方,但我不敢猜测。有人能给我一个具体的答复吗?谢了。

共有1个答案

危卜鹰
2023-03-14

这是一个很难精确回答并涵盖所有角落情况的问题。

以下是我对一个简单(希望不要过于简化)的解释:

  1. Julia代码被编译为下一次执行的本机程序集指令。
  2. 如果Julia编译器能够证明两个实现是等效的,那么您可以预期将为这两个实现生成相同的本机程序集指令(这不是100%正确,但根据我的经验,这是一个很好的近似值)。
  3. 这意味着在本机程序集级别上,只要要执行的操作和编译器拥有的类型信息相同,使用的类型(内置的或自己的)并不重要。
struct A
    a::Int
end

function f(x::Int, n)
    s = Int[]
    for i in 1:n
        push!(s,x)
    end
    s
end

function f(x::A, n)
    s = Int[]
    for i in 1:n
        push!(s,x.a)
    end
    s
end

function f2(x::A, n)
    s = A[]
    for i in 1:n
        push!(s,x)
    end
    s
end

现在,如果您运行@code_native f(1,10^6)@code_native f(A(1),10^6)@code_native f2(A(1),10^6),您将看到生成的代码(几乎)相同。

您可以在基准测试中看到这一点的效果:

julia> using BenchmarkTools

julia> @btime f(1, 10^6);
  8.567 ms (20 allocations: 9.00 MiB)

julia> @btime f(A(1), 10^6);
  8.528 ms (20 allocations: 9.00 MiB)

julia> @btime f2(A(1), 10^6);
  8.446 ms (20 allocations: 9.00 MiB)

您有相同的时间和相同的分配数量。

struct C
    a
end

function f(x::C, n)
    s = Int[]
    for i in 1:n
        push!(s,x.a)
    end
    s
end
julia> @btime f(C(1), 10^6);
  19.855 ms (21 allocations: 9.00 MiB)
 类似资料:
  • 或者我只是混淆了概念,存在类型和泛型意味着完全不同的东西。请帮我弄明白。

  • POST请求中的内容类型和数据类型是什么?假设我有这个: 是我们发送的吗?那么我们在上面的例子中发送的是JSON,而我们收到的是纯文本?我真的不明白。

  • 在研究泛型时,我注意到泛型方法和泛型类型(类或接口)在类型引入语法上的一个差异使我感到困惑。 泛型方法的语法为 文件上说 为了彼此保持一致,我希望方法语法为 ,或者类型语法(for class)为,但事实显然并非如此。 为什么一个要介绍在前,另一个要介绍在后? 我主要以的形式使用泛型,并认为可能看起来很奇怪,但这是一个主观的参数,此外对于方法也是这样。您可以调用,类似于 在寻找技术解释时,我想在指

  • 在阅读参考资料时。com文档中的std::numeric_limits,我遇到了以下声明: 还提供了所有整数类类型的专门化。(从20世纪开始) 我的问题是,我们在上面的语句中所说的整数类类型是什么意思。我的意思是,我知道是C中的内置类型。我们可以在C中提供用户定义的类。但是我从来没有读过关于整数类类型的文章。我试着在谷歌上搜索这个短语,但是没有找到任何与此相关的东西。

  • 技巧 gcc是通过文件名后缀来判断源代码语言类型的。 如果你从标准输入把源码传给gcc,那么就需要通过-x选项显式的指定语言类型: $ echo "int x;" | gcc -S -x c - $ cat ./-.s .file "" .comm x,4,4 .ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.