linux系统上下文切换测试工具,编写一个C程序以测量Linux操作系统中上下文切换所花费的时间...

分析切换时间非常困难,但是内核延迟分析工具以及oprofile(可以对内核本身进行分析)将帮助您。

为了对交互式应用程序性能进行基准测试,我编写了一个名为latencybench的小工具,用于测量意外的延迟峰值:

// Compile with g++ latencybench.cc -o latencybench -lboost_thread-mt

// Should also work on MSVC and other platforms supported by Boost.

#include

#include

#include

#include

#include

#include

volatile bool m_quit = false;

extern "C" void sighandler(int) {

m_quit = true;

}

std::string num(unsigned val) {

if (val == 1) return "one occurrence";

return boost::lexical_cast<:string>(val) + " occurrences";

}

int main(int argc, char** argv) {

using namespace boost::posix_time;

std::signal(SIGINT, sighandler);

std::signal(SIGTERM, sighandler);

time_duration duration = milliseconds(10);

if (argc > 1) {

try {

if (argc != 2) throw 1;

unsigned ms = boost::lexical_cast(argv[1]);

if (ms > 1000) throw 2;

duration = milliseconds(ms);

} catch (...) {

std::cerr << "Usage: " << argv[0] << " milliseconds" << std::endl;

return EXIT_FAILURE;

}

}

typedef std::map Durations;

Durations durations;

unsigned samples = 0, wrongsamples = 0;

unsigned max = 0;

long last = -1;

std::cout << "Measuring actual sleep delays when requesting " << duration.total_milliseconds() << " ms: (Ctrl+C when done)" << std::endl;

ptime begin = boost::get_system_time();

while (!m_quit) {

ptime start = boost::get_system_time();

boost::this_thread::sleep(start + duration);

long actual = (boost::get_system_time() - start).total_milliseconds();

++samples;

unsigned num = ++durations[actual];

if (actual != last) {

std::cout << "\r " << actual << " ms " << std::flush;

last = actual;

}

if (actual != duration.total_milliseconds()) {

++wrongsamples;

if (num > max) max = num;

std::cout << "spike at " << start - begin << std::endl;

last = -1;

}

}

if (samples == 0) return 0;

std::cout << "\rTotal measurement duration: " << boost::get_system_time() - begin << "\n";

std::cout << "Number of samples collected: " << samples << "\n";

std::cout << "Incorrect delay count: " << wrongsamples << boost::format(" (%.2f %%)") % (100.0 * wrongsamples / samples) << "\n\n";

std::cout << "Histogram of actual delays:\n\n";

unsigned correctsamples = samples - wrongsamples;

const unsigned line = 60;

double scale = 1.0;

char ch = '+';

if (max > line) {

scale = double(line) / max;

ch = '*';

}

double correctscale = 1.0;

if (correctsamples > line) correctscale = double(line) / correctsamples;

for (Durations::const_iterator it = durations.begin(); it != durations.end(); ++it) {

std::string bar;

if (it->first == duration.total_milliseconds()) bar = std::string(correctscale * it->second, '>');

else bar = std::string(scale * it->second, ch);

std::cout << boost::format("%5d ms | %s %d") % it->first % bar % it->second << std::endl;

}

std::cout << "\n";

std::string indent(30, ' ');

std::cout << indent << "+-- Legend ----------------------------------\n";

std::cout << indent << "| > " << num(1.0 / correctscale) << " (of " << duration.total_milliseconds() << " ms delay)\n";

if (wrongsamples > 0) std::cout << indent << "| " << ch << " " << num(1.0 / scale) << " (of any other delay)\n";

}

Ubuntu 2.6.32-14通用内核的结果。在测量时,我正在用四个核心编译C代码,同时使用OpenGL图形进行游戏(以使它更有趣):

Total measurement duration: 00:01:45.191465

Number of samples collected: 10383

Incorrect delay count: 196 (1.89 %)

Histogram of actual delays:

10 ms | >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 10187

11 ms | *************************************************** 70

12 ms | ************************************************************ 82

13 ms | ********* 13

14 ms | ********* 13

15 ms | ** 4

17 ms | *** 5

18 ms | * 2

19 ms | **** 6

20 ms | 1

+-- Legend ----------------------------------

| > 169 occurrences (of 10 ms delay)

| * one occurrence (of any other delay)

与rt-patched内核我得到更好的结果,几乎10-12毫秒只。

打印输出中的图例看起来是四舍五入错误或某事的痛苦(并且粘贴的源代码不是完全相同的版本)。我从来没有真正抛光这个应用程序的发布…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值