【发布时间】:2017-09-16 18:14:40
【问题描述】:
我有一个 8400 万行的 XML,我正在 Red Hat Linux 中使用 'gawk' 处理它。 (好吧,有些人会建议使用其他工具而不是 GAWK,但我的 XML 没有多行标签或任何其他使 GAWK 不是该工作的好选择的特性。)
我关心的是性能。
我最初的 AWK 脚本是这样的:
# Test_1.awk
BEGIN {FS = "<|:|=";}
{
if ($3 == "SubNetwork id")
{
# do something
}
}
END {
# print something
}
这会进行 8400 万次字符串比较,每行一次。
我注意到“SubNetwork id”仅在行中有 4 个字段时出现(NF=4),因此我更改了脚本以减少字符串比较:
# Test_2.awk
BEGIN {FS = "<|:|=";}
{
if (NF == 4)
{
if ($3 == "SubNetwork id")
{
# do something
}
}
}
END {
# print something
}
我运行它,发现我检查了 'NF == 4' 8400 万次(很明显)和 '$3 == "SubNetwork id"' 只有 300 万次。太好了,我减少了字符串比较的次数,我一直认为这比简单的整数比较更耗时(NF 是整数,对吗?)。
当我测试这两个脚本的性能时,我感到很惊讶。大多数时候 Test_1 比 Test_2 快。我多次运行它们以考虑可能正在使用 CPU 时间的其他进程,但总的来说,我的测试是在 CPU 或多或少“空闲”时运行的。
我的大脑告诉我,8400 万个整数比较加上 300 万个字符串比较肯定比 8400 万个字符串比较快,但显然我的推理有问题。
我的 XML 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<ConfigDataFile xmlns:un="specific.xsd" xmlns:xn="generic.xsd">
<configData dnPrefix="Undefined">
<xn:SubNetwork id="ROOT_1">
<xn:SubNetwork id="ROOT_2">
<xn:attributes>
...
</xn:attributes>
</xn:SubNetwork>
<xn:SubNetwork id="ID_1">
....
</xn:SubNetwork>
<xn:SubNetwork id="ID_2">
.....
</xn:SubNetwork>
</xn:SubNetwork>
</configData>
</ConfigDataFile>
任何帮助理解这个性能问题将不胜感激。
提前致谢。
【问题讨论】:
标签: performance awk gawk