【问题标题】:Can I speed up parsing perforce changes/describe output?我可以加快解析 perforce 更改/描述输出吗?
【发布时间】:2013-10-31 01:52:55
【问题描述】:

我的目标是从“p4 更改”中提取 POST 响应中给定更改编号的更改编号/日期/时间/描述。我制作了一个简单的 PHP 脚本,它可以解析必要的 shell 命令(虽然很麻烦,但它可以工作)并填充一个 JSON 数组。

在我开始查看“p4 describe -s”并在其中解析出一个特殊字段之前,一切正常,我们在其中列出了与 changenum 相关的错误,如下所示:

bug2342 状态已修复;

bug2343 状态已修复;

脚本必须对每个 changenum 执行单独的“p4 describe”,这当然需要一段时间。对于约 1000 个更改编号的范围,我看到 30 多秒的响应时间:(

我能做些什么来加快速度? 我什至在考虑在前端做两遍:​​首先获取所有的changenums,显示它们(将错误ID留空)然后异步获取大约10个左右的批次的错误编号并迭代填充丢失的数据。

$cmd = 'p4 changes -t -s submitted -l //depot/...@' . $changenum1 . ',' . $changenum2 . ' 2>&1 |
  awk \'BEGIN { RS = "^Change |\n^Change "; FS = "^Change |\n^Change " } {print $1 "::::"}\'';
$output = shell_exec($cmd);
$changes = split("::::", trim($output));
$cc = array();
$i = 0;
foreach ($changes as $change) {
if (empty($change)) {
    continue;
}

//example here: '3193358 on 2012/10/08 11:05:42 by user@client\n "some lengthy multiline description"'
$change = trim($change);
$c = array();
$basics = preg_split( "/( |\n)/", $change);
$c["cnum"] = $basics[0];
$c["date"] = $basics[2];
$c["time"] = $basics[3];
$user = $basics[5];
$c["user"] = preg_replace('/@.*/', "", $user);
//echo "cnum: $c["cnum"], date: $c["date"]], time: $c["time"], user: $c["user"]";

//THIS IS VERY SLOW
$cmd2 = 'p4 describe -s ' . $c["cnum"] . ' 2>&1 | egrep "^bug[0-9]+" | sed -re "s/bug([0-9]+).*/\1/"';
$output2 = shell_exec($cmd2);
$bugs = split("\n", trim($output2));
$c["bugs"] = $bugs;

$pos = strpos($change, "\n"); //remove first line
if ($pos !== false) {
    $description = substr($change, $pos +1);
} else {
    $description = $change;
}
//remove multiple whitespace
$description2 = preg_replace('/\s+/', ' ', $description);
//remove blank new lines etc
$description3 = preg_replace('/^\n+|^[\t\s]*\n+/m', "", $description2);

$c["desc"] = trim($description3);
$cc[$i++] = $c;
}

$output = __json_encode($cc);

【问题讨论】:

  • 为什么你必须运行一个单独的'p4 describe'? 'p4 changes -l' 不是已经在输出中有完整的描述了吗?
  • 是的,这就是问题所在。 “bug”部分没有出现在描述中,它是一些内部添加的功能,我只能通过“p4 describe”获得。
  • 为什么每次更改号码都必须拨打p4 describep4 describe 接受多个更改编号作为参数。您应该只能调用它一次。
  • 也许整个过程中“非常慢”的部分是在描述过程中附加错误ID的“内部添加的功能”?您能否向您的管理员询问有关如何配置 Perforce 系统的该部分的更多信息?也许是特殊的表单触发?
  • @jamesdlin 哦,天哪,我不敢相信我忽略了这一点。我切换代码以将所有 cnums 发送到“p4 describe”,然后将结果解析到我的数组中。 10K 条目 = 2 秒,这绝对是可以管理的。谢谢你的提示!如果您将此添加为答案,我会接受。

标签: php regex sed awk perforce


【解决方案1】:

您不需要为每个更改号单独调用p4 describe(从而多次往返于 Perforce 服务器); p4 describe 命令接受多个更改编号作为参数。因此,您应该只能调用它一次,例如:

p4 describe -s 100 101 102 103

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多