我知道你可以使用ccall调用函数并使用cglobal获取指向全局符号的指针。但是如何访问宏?
例如,我不想复制此代码
clock_t start = clock();
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;
如何在最后执行CLOCKS_PER_SEC宏?
答案 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
上。