我想知道从C迁移到shell脚本的程序性能会有多糟糕。
我有强化的I / O操作。
例如,在C中,我从文件系统文件中读取循环并写入另一个文件系统文件。我正在接受每一行的部分而没有任何一致的关系。我是用指针做的。一个非常简单的程序。
在Shell脚本中,要移动一行,我正在使用${var:(char):(num_bytes)}
。在我完成处理每一行后,我只是将它连接到另一个文件。
"$out" >> "$filename"
该程序的功能如下:
while read line; do
out="$out${line:10:16}.${line:45:2}"
out="$out${line:106:61}"
out="$out${line:189:3}"
out="$out${line:215:15}"
...
echo "$out" >> "outFileName"
done < "$fileName"
问题是,C需要半分钟来处理400MB文件,而shell脚本需要15分钟。
我不知道我做错了什么或者没有在shell脚本中使用正确的运算符。
编辑:我不能使用awk,因为没有处理行的模式
我尝试评论“echo $ out”&gt;&gt; “$ outFileName”但它并没有变得更好。我认为问题是$ {line:106:61}操作。有什么建议?
感谢您的帮助。
答案 0 :(得分:4)
我怀疑,根据您的描述,您正在shell脚本中生成新进程。如果是这样的话,那就是你的时间。 fork/exec新进程需要大量的操作系统资源。
答案 1 :(得分:3)
当Donitor和Dietrich闷闷不乐时,我对AWK语言进行了一些研究,并且正如他们所说的那样,它取得了圆满成功。这是AWK计划的一个小例子:
#!/bin/awk -f
{
option=substr($0, 5, 9);
if (option=="SOMETHING"){
type=substr($0, 80, 1)
if (type=="A"){
type="01";
}else if (type=="B"){
type="02";
}else if (type=="C"){
type="03";
}
print substr($0, 7, 3) substr($0, 49, 8) substr($0, 86, 8) type\
substr($0, 568, 30) >> ARGV[2]
}
}
它就像一个魅力。处理500mb文件只需1分钟
答案 2 :(得分:2)
C程序有什么问题?它坏了吗?太难维护了?太不灵活了?你是一个壳牌而不是C专家?
如果没有损坏,请不要修复它。
看看Perl也可能是一种选择。比C更容易修改并且仍然可以快速进行I / O操作;而且在Perl中创建无用的叉比在shell中创建更难。
如果你告诉我们C程序到底做了什么,也许在Unix工具箱中有一个简单且快于解决方案的解决方案,包括sed,grep,awk或其他小玩意儿。换句话说,告诉我们你真正想要实现的目标,不要让我们解决你遇到的一些随机问题,同时追求你认为朝着实际目标迈出的一步。
好吧,shell脚本的一个问题是open
中重复的echo "$out" >> "outFileName"
。请改用:
while read line; do
echo "${line:10:16}.${line:45:2}${line:106:61}${line:189:3}${line:215:15}..."
done < "$fileName" > "$outFileName"
作为替代方案,只需使用cut
实用程序(但请注意,它不会在第一部分之后插入点):
cut -c 10-26,45-46,106-166 "$fileName" > "$outFileName"
你明白了吗?