我对 Julia 和 R 实际如何解释代码知之甚少,但我读到过使 Julia 如此之快的原因是多重分派,它可以预测类型。
现在在 R 中,S4 类也有多个调度,所以我的问题是:
当所有东西都是用 S4 类编写的时候,R 能像 Julia 一样快吗?
如果不是:是什么阻碍了 R 和 Julia 一样快?
R 是一种解释型编程语言 - 请参阅https://cran.r-project.org/doc/FAQ/R-FAQ.html#What-is-R_003f。因此,您有一个解释器,可以在代码运行时解释并执行后续行。R 中具有良好性能的库只是用 C 编写的 - 例如,请参见src优秀数据表库中的文件夹:https : //github.com/Rdatatable/data.table
另一方面,Julia 是一种编译语言(并且在相同的动态中并使用多个分派)。Julia 使用 LLVM 编译器系统在执行之前从任何代码段生成汇编。以这个 Julia 函数为例:
f(x,y) = x < y ? 2x : 5;
Run Code Online (Sandbox Code Playgroud)
当 Julia 第一次执行它时,它会得到一个汇编代码,实际上如果你愿意,你可以看到它:
julia> code_native(f, (Int, Int))
.text
; ? @ REPL[8]:1 within `f'
pushq %rbp
movq %rsp, %rbp
; ?? @ int.jl:82 within `<'
cmpq %rdx, %rcx
; ??
jge L17
; ?? @ int.jl:87 within `*'
addq %rcx, %rcx
; ??
movq %rcx, %rax
popq %rbp
retq
L17:
movl $5, %eax
popq %rbp
retq
nopl (%rax,%rax)
; ?
Run Code Online (Sandbox Code Playgroud)
这是一组由您的 CPU 直接理解的指令 - 不涉及解释器。如果您决定用例如 C 编写这个函数并编译它,您可以期待非常相似的装配线。
最后,请注意,此代码是特定于类型的 - 如果您尝试code_native(f, (Int, Float64))(使用不同类型) - 您将获得完全不同的程序集(尝试自己!)。
因此,解释型语言和编译型语言的性质非常不同,R 只有在使用用 C(或其他编译型语言)编写的外部库时才能快速。
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |