在julia中的writedlm()未保存time_ns()结果

在julia中的writedlm()未保存time_ns()结果,julia,Julia,我正在使用一个在for循环中包含许多函数调用的程序。简而言之,是这样的: function something() .... .... timer = zeros(NSTEP); for it = 1:NSTEP # time steps tic = time_ns(); Threads.@threads for p in 1:2 # Star parallel of two sigma functions Threads.

我正在使用一个在for循环中包含许多函数调用的程序。简而言之,是这样的:

function something()
....
....
    timer = zeros(NSTEP);
    for it = 1:NSTEP # time steps 

        tic = time_ns();

        Threads.@threads for p in 1:2  # Star parallel of two sigma functions
        Threads.lock(l);
        Threads.unlock(l);
        arg_in_sig[p] = func_sig[p](arg_in_sig[p]);
        end
       .....
       .....
       Threads.@threads for p in 1:2
       Threads.lock(l)
       Threads.unlock(l)
       arg_in_vel[p] = func_vel[p](arg_in_vel[p])
       end

       toc=time_ns();

       timer[i] = toc-tic;

    end # time loop
    writedlm("timer.txt",timer)
    return
end
我想做的是测量每次循环迭代所需的时间,将结果保存在一个名为“timer.txt”的输出文件中。问题是它不起作用。 它保存一个文件,文件上全是零(两个或三个值除外,这更容易混淆)。 我制作了一个玩具示例,如:

using DelimitedFiles;
function test()
    a=zeros(1000)
    for i=1:1000
        tic = time_ns();
        C = rand(20,20)*rand(20,20);
        toc = time_ns();
        a[i] = toc-tic;
    end
    writedlm("aaa.txt",a);
    return a;
end
而这些实际上是有效的(它节省了很多钱!)。我正在实现线程。@Threads?。在我的程序中,writedlm()和time_ns()之间会发生什么


任何帮助都是非常感谢的

您正在迭代
,但尝试通过以下方式保存:

timer[i] = toc-tic;
虽然它应该是

timer[it] = toc-tic;
也许您在全局范围内有一些
i
,因此代码仍然有效


另外,锁定线程并立即解锁似乎没有多大意义。此外,当您迭代
p
时,它恰好也是保存结果的
向量
单元格的索引,根本不需要使用锁定机制(除非您调用一些依赖于全局状态的函数)

在调用writedlm之前,您是否以某种方式检查所有线程是否已成功完成任务?嗨@Bill No,我没有检查任何要完成的任务。我真的以为他们在我叫writedlm的时候就完成了。。。我怎么能这样做?。谢谢为了得到一个好的答案,你可能需要修改这个问题,给出一个最小规模的工作示例,它运行并显示问题谢谢你的回答。上面的代码是为了解释而键入的。在原始代码中,索引为
ìt
。关于最后一条评论,我认为我的函数取决于全局状态,尽管我并不十分确定……我认为如果您需要更多帮助,您需要提供一个暴露不希望出现的行为的最小工作示例。