我有一个程序,其中大约有10个任务同时运行。它们都调用相同的函数,但使用不同的值。我想知道每个任务执行此函数需要多长时间。然而,我似乎不能使用这样的东西: A:=Clock; MyFunction(...); B:=Clock; Time:= B-A; 实际上,我认为这不会返回“真正”的CPU时间,而是函数开始和结束之间经过的时间,这不正确,因为我的任务在执行该函数时可能会被切换。所以,我想知道是否有一种方法可以了解每个任务的“真正”CPU时间,即它们真正使用CPU的时间?
我认为您需要使用附录 D.14提供的功能:这个子句描述了一个语言定义的软件包,用于测量执行时间。给定任务的执行时间或 CPU 时间被定义为系统执行该任务的时间,包括代表其执行运行时或系统服务所花费的时间。这在 Ada 2005 和 Ada 2012 中指定。但它是否在您的编译器和操作系统中可用则是另一个问题!例如,在 Mac OS X(GNAT GPL 2013、GCC 4.8)上,“Execution_Time 在此配置中不受支持”。
Burns & Welling的《Ada中的并发和实时编程》(如果您能够获得副本,则为ch15.5)将其描述为执行时间时钟,这是在Ada-2005中添加的。您需要查找安装中名为“Ada.Execution_Time”的包。希望它的规范可以告诉您所需的全部信息。还可能有一个子包“Ada.Execution_Time.Timers”,可以让您设置要发生的事件,例如超过CPU时间预算时。在我的系统上,使用安装在/usr/local/bin中的Gnat,相关文件为:/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/adainclude/a-exetim.ads,您需要的函数是Ada.Execution_Time.Clock。