Shell脚本与C性能

时间:2012-10-26 14:26:04

标签: c performance bash shell

我想知道从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}操作。有什么建议?

感谢您的帮助。

3 个答案:

答案 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"

你明白了吗?