小编sin*_*raj的帖子

为什么clock_gettime如此不稳定?

介绍

  • 章节旧问题包含初始问题(此后已添加进一步调查结论).

  • 跳到部分进一步调查下面的不同的定时的方法(详细比较rdtsc,clock_gettimeQueryThreadCycleTime).

  • 我相信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_gettimerdtsc对于相同的代码段(101个测量= 2525个读数25次运行):

  • clock_gettime:

    • 1881测量11 ns,
    • 595次测量(几乎正常分布)在3369和3414 ns之间,
    • 2次测量11680 ns,
    • 1测量1506022 ns,和
    • 其余的在900到5000 ns之间.

    • 最小值:11 ns

    • 最大值:1506022 ns
    • 平均值:1471.862 ns …

linux time profiling

34
推荐指数
1
解决办法
1万
查看次数

如何在C++ 0x中重载运算符以组合函数?

有没有办法超载,比如>>操作员的功能组合?操作员应该在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)

lambda functional-programming composition c++11

6
推荐指数
1
解决办法
588
查看次数

如何使用使用它的项目在多项目构建中开发sbt插件?

是否可以在多项目设置中构建sbt插件并在同一个多项目的其他子项目中使用该插件?

例如:

root/
+  mySbtPlugin/
+  myProject/
   +  project/
      +  plugins.sbt    // Uses `mySbtPlugin`
Run Code Online (Sandbox Code Playgroud)

sbt

4
推荐指数
1
解决办法
765
查看次数

Lambda捕获问题与迭代器?

如果已经问过这个问题,请道歉,但假设我们有这个代码(我用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)

c# lambda closures scope

2
推荐指数
1
解决办法
881
查看次数