java – 生成线程利用率的摘要

我有一个应用程序,每次发出请求时都会写出日志.日期和时间信息指的是功能的结束时间.通过使用执行时间,我们计算请求开始的时间.

以下是日志目前的样子:

year | month | day | hour | minute | seconds | Thread | UserName           | ExecTime
2014 | 3     | 26  | 8    | 57     | 300     | 1      | file_download      | 33.86
2014 | 3     | 26  | 8    | 57     | 45      | 1      | file_upload        | 0.359
2014 | 3     | 26  | 8    | 57     | 55      | 1      | folder_browse      | 0.234
2014 | 3     | 26  | 8    | 58     | 11      | 1      | sending_email      | 0.14
2014 | 3     | 26  | 8    | 58     | 20      | 1      | browsing_favorites | 0.985
2014 | 3     | 26  | 8    | 58     | 29      | 1      | file_download      | 0.266
2014 | 3     | 26  | 8    | 58     | 33      | 1      | file_upload        | 0.296
2014 | 3     | 26  | 8    | 58     | 37      | 1      | file_zip           | 0.25
2014 | 3     | 26  | 8    | 58     | 41      | 1      | view_properties    | 0.0
2014 | 3     | 26  | 8    | 58     | 46      | 1      | file_download      | 0.187

仅用于说明目的

由于请求可能会持续几分钟甚至几小时,因此很难按分钟计算每个线程的利用率.以下输出说明了我之后的输出:

Thread | month | day | hour | minute | % Busy
1      | 3     | 26  | 8    | 57     | 0.5
2      | 3     | 26  | 8    | 57     | 0.1
3      | 3     | 26  | 8    | 57     | 0.9

仅用于说明目的

例如,如果请求在12:30:30开始执行并在12:32:30结束,则上表将如下所示:

Thread | month | day | hour | minute | % Busy
1      | 3     | 26  | 12   | 29     | 0
1      | 3     | 26  | 12   | 30     | 0.5
1      | 3     | 26  | 12   | 31     | 1
1      | 3     | 26  | 12   | 32     | 0.5
1      | 3     | 26  | 12   | 33     | 0

仅用于说明目的

输出中的分钟数是第一个请求和最后一个请求之间可以在日志中找到的分钟数.

UPDATE

以下是@TessellatingHeckler要求澄清的摘要:

>计算开始时间
>对于开始/结束部分分钟计算利用率分数.
>计算中间的分钟为100%忙
>在每分钟内添加多个请求/起始端重叠.
>填写缺少的分钟为0%忙.
>显示每个线程的列表,从计算的第一个条目的开始到最后一个条目,显示日期时间到分钟和%繁忙

我知道这很难,但我只需要一种能很好地转化为代码的方法.我很高兴使用perl,powershell或java.

谢谢

最佳答案 以下内容将为您完成大部分工作.你必须弄清楚Busy实际上意味着什么:

use List::Util qw(sum);

use strict;
use warnings;

<DATA>; # Skip Header

my %thread;
while (<DATA>) {
    chomp;
    my @data = split /\s*\|\s*/;
    push @{$thread{$data[6]}}, \@data;
}

print "Thread | month | day | hour | minute | ExecTime\n";
for my $id (sort {$a <=> $b} keys %thread) {
    my $time = sum map {$_->[7]} @{$thread{$id}};
    printf "%-6s | %-5s | %-3s | %-4s | %-6s | %.03f\n", $id, @{$thread{$id}[0]}[1,2,3,4], $time;
}

__DATA__
year | month | day | hour | minute | seconds | Thread |  ExecTime ( seconds )
2014 | 3     | 26  | 8    | 57     | 32      | 1      |  33.86
2014 | 3     | 26  | 8    | 57     | 45      | 2      |  0.359
2014 | 3     | 26  | 8    | 57     | 55      | 3      |  0.234
2014 | 3     | 26  | 8    | 58     | 11      | 1      |  0.14
2014 | 3     | 26  | 8    | 58     | 20      | 2      |  0.985
2014 | 3     | 26  | 8    | 58     | 29      | 3      |  0.266
2014 | 3     | 26  | 8    | 58     | 33      | 3      |  0.296
2014 | 3     | 26  | 8    | 58     | 37      | 1      |  0.25
2014 | 3     | 26  | 8    | 58     | 41      | 2      |  0.0
2014 | 3     | 26  | 8    | 58     | 46      | 1      |  0.187

输出:

Thread | month | day | hour | minute | ExecTime
1      | 3     | 26  | 8    | 57     | 34.437
2      | 3     | 26  | 8    | 57     | 1.344
3      | 3     | 26  | 8    | 57     | 0.796
点赞