执行命令行管理程序命令时出现性能问题
Performance Issue in Executing Shell Commands
在我的应用程序中,我需要通过 c++ 代码执行大量的 shell 命令。我发现该程序需要 30 多秒才能执行 6000 个命令,这太不可接受了!有没有其他更好的方法来执行 shell 命令(使用 c/c++ 代码(?
//Below functions is used to set rules for
//Linux tool --TC, and in runtime there will
//be more than 6000 rules to be set from shell
//those TC commans are like below example:
//tc qdisc del dev eth0 root
//tc qdisc add dev eth0 root handle 1:0 cbq bandwidth
// 10Mbit avpkt 1000 cell 8
//tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth
// 100Mbit rate 8000kbit weight 800kbit prio 5 allot 1514
// cell 8 maxburst 20 avpkt 1000 bounded
//tc class add dev eth0 parent 1:0 classid 1:2 cbq bandwidth
// 100Mbit rate 800kbit weight 80kbit prio 5 allot 1514 cell
// 8 maxburst 20 avpkt 1000 bounded
//tc class add dev eth0 parent 1:0 classid 1:3 cbq bandwidth
// 100Mbit rate 800kbit weight 80kbit prio 5 allot 1514 cell
// 8 maxburst 20 avpkt 1000 bounded
//tc class add dev eth0 parent 1:1 classid 1:1001 cbq bandwidth
// 100Mbit rate 8000kbit weight 800kbit prio 8 allot 1514 cell
// 8 maxburst 20 avpkt 1000
//......
void CTCProxy::ApplyTCCommands(){
FILE* OutputStream = NULL;
//mTCCommands is a vector<string>
//every string in it is a TC rule
int CmdCount = mTCCommands.size();
for (int i = 0; i < CmdCount; i++){
OutputStream = popen(mTCCommands[i].c_str(), "r");
if (OutputStream){
pclose(OutputStream);
} else {
printf("popen error!n");
}
}
}
更新
我尝试将所有 shell 命令放入 shell 脚本中,并让测试应用程序使用 system("xxx.sh"( 调用此脚本文件。这一次,执行所有 6000 个 shell 命令条目需要 24 秒,比我们之前需要的要少。但这仍然比我们预期的要大得多!有没有其他方法可以将执行时间减少到 10 秒以下?
因此,最有可能(根据我在类似类型事情上的经验(,大部分时间都花在启动运行 shell 的新进程上,在 shell 中执行实际命令的时间非常短。(实际上,30 秒内的 6000 听起来并不太可怕(。
有多种方法可以做到这一点。我很想尝试将它们全部合并到一个 shell 脚本中,而不是运行单独的行。这将涉及将所有"tc"字符串写入文件,然后将其传递给popen((。
另一个想法是,如果你真的可以将几个字符串组合成一个执行,也许?
如果命令完整且可直接执行(即不需要 shell 来执行程序(,您也可以自己做fork
和exec
。这将节省创建 shell 进程,然后创建实际进程。
此外,您可以考虑并行运行少量进程,这在任何现代计算机上都可能会通过您拥有的处理器内核数量来加快速度。
你可以启动shell(/bin/sh(并在那里通过管道传输所有命令来解析输出。或者,您可以创建一个 Makefile,因为这可以让您更好地控制命令的执行方式、并行执行和错误处理。
相关文章:
- 在类中使用随机生成器时出现性能问题
- Qt OpenGL 渲染到纹理性能问题
- 剪辑性能问题
- OpenCV - 基本操作 - 性能问题 [模式:发布]
- 使用 #define 进行跟踪日志记录以避免性能问题
- 在 Qt C++ 中在自定义项委托上绘制文本时的性能问题
- std::函数有性能问题,如何避免?
- 使用 const double* const 作为模板参数 - 代码性能问题
- 在C 中读取大型CSV文件性能问题
- MPI 二进制文件 I/O 基本功能和性能问题
- 使用STD :: MAP在数据及其性能问题中查找重复项.我可以预先分配吗?
- C 功能性能问题
- 在C 性能问题中使用Getter返回地图
- 初始化每个班级成员时的性能问题
- 事件(开始,结束),1天的最大事件.C++ 中的性能问题
- 在X64模式下从C /CLI调用MASM PROC会产生意外的性能问题
- OpenGL:MESA3D屏幕上的软件渲染性能问题
- 是包含容器性能问题的STL关联容器
- 任何性能问题都在qt框架中使用了stackedwidget的最大页面数
- SHGetFileInfo性能问题