章节旧问题包含初始问题(此后已添加进一步调查和结论).
跳到部分进一步调查下面的不同的定时的方法(详细比较rdtsc,clock_gettime和QueryThreadCycleTime).
我相信CGT的不稳定行为可归因于有缺陷的内核或有缺陷的CPU(参见结论部分).
用于测试的代码位于此问题的底部(请参阅附录部分).
道歉的长度.
简而言之:我clock_gettime用来衡量许多代码段的执行时间.我在单独的运行之间经历了非常不一致的测量.与其他方法相比,该方法具有极高的标准偏差(参见下面的说明).
问题:clock_gettime与其他方法相比,有没有理由给出如此不一致的测量结果?是否有一种替代方法具有相同的分辨率来解决线程空闲时间?
说明:我正在尝试分析C代码的一些小部分.每个代码段的执行时间不超过几微秒.在单次运行中,每个代码段将执行数百次,从而产生runs × hundreds测量值.
我还必须只测量线程实际执行的时间(这就是为什么rdtsc不适合).我还需要一个高分辨率(这就是为什么times不适合).
我尝试了以下方法:
rdtsc (在Linux和Windows上),
clock_gettime (在Linux上使用'CLOCK_THREAD_CPUTIME_ID';)和
QueryThreadCycleTime (在Windows上).
方法:分析在25次运行中进行.在每次运行中,单独的代码段重复101次.因此我有2525次测量.然后我查看测量的直方图,并计算一些基本的东西(如平均值,std.dev.,中位数,模式,最小值和最大值).
我没有介绍我如何测量三种方法的"相似性",但这仅仅涉及对每个代码段花费的时间比例的基本比较("比例"意味着时间被标准化).然后我看看这些比例的纯粹差异.这种比较表明,在25次运行中平均所有'rdtsc','QTCT'和'CGT'的比例相同.但是,下面的结果表明'CGT'具有非常大的标准偏差.这使得它在我的用例中无法使用.
结果:
的比较clock_gettime与rdtsc对于相同的代码段(101个测量= 2525个读数25次运行):
clock_gettime:
其余的在900到5000 ns之间.
最小值:11 ns
有没有办法超载,比如>>操作员的功能组合?操作员应该在lambda上无缝地工作std::function?
要求:
bind调用,这是一个快速而肮脏的示例,说明了所需的行为:
#include <iostream>
#include <functional>
using namespace std;
// An example of a quick and dirty function composition.
// Note that instead of 'std::function' this operator should accept
// any functional/callable type (just like 'bind').
template<typename R1, typename R2, typename... ArgTypes1>
function<R2(ArgTypes1...)> operator >> (
const function<R1(ArgTypes1...)>& f1,
const function<R2(R1)>& f2) {
return [=](ArgTypes1... args){ return f2(f1(args...)); };
}
int main(int argc, char **args) {
auto l1 = [](int …Run Code Online (Sandbox Code Playgroud) 是否可以在多项目设置中构建sbt插件并在同一个多项目的其他子项目中使用该插件?
例如:
root/
+ mySbtPlugin/
+ myProject/
+ project/
+ plugins.sbt // Uses `mySbtPlugin`
Run Code Online (Sandbox Code Playgroud) 如果已经问过这个问题,请道歉,但假设我们有这个代码(我用Mono 2.10.2运行它并用gmcs2.10.2.0 编译):
using System;
public class App {
public static void Main(string[] args) {
Func<string> f = null;
var strs = new string[]{
"foo",
"bar",
"zar"
};
foreach (var str in strs) {
if ("foo".Equals(str))
f = () => str;
}
Console.WriteLine(f()); // [1]: Prints 'zar'
foreach (var str in strs) {
var localStr = str;
if ("foo".Equals(str))
f = () => localStr;
}
Console.WriteLine(f()); // [2]: Prints 'foo'
{ int i = 0;
for (string str; …Run Code Online (Sandbox Code Playgroud)