你如何在朱莉娅中调用c宏

时间:2017-08-01 09:45:57

标签: julia

我知道你可以使用ccall调用函数并使用cglobal获取指向全局符号的指针。但是如何访问宏?

例如,我不想复制此代码

clock_t start = clock();
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;

如何在最后执行CLOCKS_PER_SEC宏?

2 个答案:

答案 0 :(得分:1)

CLOCKS_PER_SEC是标准头文件time.h中定义的常量。

最好使用Julia中提供的计时设备,并将程序保持为一种语言(正如预期的那样)。但是如果你坚持,你可以创建以下简单的C程序:

#include <stdio.h>
#include <time.h>

int main(int argc, char** argv) {
    printf("%ld\n",CLOCKS_PER_SEC);
  return 0;
}

使用类似gcc clocks_per_sec.c -o clocks_per_sec的内容进行编译。 然后使用以下命令从Julia运行它:

julia> clocks_per_sec = parse(Int,read(`./clocks_per_sec`,String))
1000000

只需获取一次数字并将其作为常量插入Julia程序可能更简单,假设系统将在特定计算机上运行,​​或者在外部C依赖项下不会长时间维护。

P.S。 Julia代码与0.7版本相关,在早期版本中,使用readstring(...))代替read(...,String)

答案 1 :(得分:0)

留在朱莉娅内的另一个答案可能是(尝试一下):

for i=1:10
    b = 10^i
    tic()
    s = 0
    start = ccall(:clock,Clonglong,())
    for i=1:b
        s+=i
    end
    t = toq()
    stop = ccall(:clock,Clonglong,())
    if t>1.0
        println("CLOCK_PER_SEC most probably is ",10^(round(Int,log10((stop-start)/t))))
        break
    end
end

这个答案假设CLOCKS_PER_SEC是10的幂,这似乎是普遍的情况。请注意,for循环内部用于浪费处理时间,而不是墙上时间,这可能只是浪费在sleep上。