for里面嵌套IF的效率问题求助

桃子 2012-01-14 11:05:25
现有一个vector<cstring> vecStr
我有两套规则A和B,需要对里面的元素做处理...

以下两种代码,哪种更好一些?


vector<cstring> vecA;
vector<cstring> vecB;
for(vecStr) // 遍历vector
{
if(...)// 需要做A规则
{
//使用规则A做处理
vecA.push_back();
}

if(...)// 需要做B规则
{
//使用规则B做处理
vecB.push_back();
}
}


或者是:

vector<cstring> vecA;
if()// 需要做A规则
{
for(vecStr) // 遍历vector
{
//使用规则A做处理
vecA.push_back();
}
}

vector<cstring> vecB;
if()// 需要做B规则
{
for(vecStr) // 遍历vector
{
//使用规则A做处理
vecB.push_back();
}
}


直觉上,觉得这两种在执行效率上应该是有区别的...
求解答...
...全文
483 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
linux-novice 2012-01-16
  • 打赏
  • 举报
回复
第二种的规则很难找,有时候第一种的可读性会好一些,如果不是你的平台对指令执行时间有要求第一种是比较好的选择吧。如果是无聊自己玩,都试试吧。性能应该第二个好
彭家老三 2012-01-15
  • 打赏
  • 举报
回复
我记得好像林锐博士那本《高质量C++\C编程指南》中有对这种情况的描述,和6楼说的一样。
peng_weida 2012-01-15
  • 打赏
  • 举报
回复
效率差不多的吧
无名剑 2012-01-15
  • 打赏
  • 举报
回复
第二种效率要高。 表面看起来似乎做了两次遍历,实际上两次遍历之后的次数 却只是把所有数据过了一遍

从汇编执行行数来看 第二种要比第一种少很多条汇编指令

如果对付那些消耗巨大的消息处理,比如判断一条消息是否发送所有连接当前服务器的客户端

应该是先判断消息合法性,再进行发送,而不是不顾三七二十一直接就发送然后每次发送再判断

这样每次判断效率会低很多
for (;;)
{
if()
{
}
}

这个消息判断合法就发送 不合法直接不用发送
if ()
{
for(;;)
{
}
}

明显会比第一种要快很多,所有消耗都是从小累积起来的
除非是一些可能导致系统崩溃之类的安全判定,为代码安全添加判定,这些消耗必须得有
否则一些逻辑上可以减少的消耗尽量减少。 如果怕代码不清楚 直接写上几行注释就可以了
昨夜无风 2012-01-15
  • 打赏
  • 举报
回复
我推荐第一种,

第一种只需要一次遍历,第二种要两次遍历。
薛定谔之死猫 2012-01-14
  • 打赏
  • 举报
回复
在敝人看来,两种方案实现的不是同一个东西~

如果楼主认为是同一个东西的话,那两者的效率是一样,if判断条件来源不明,不容易判断
iamnobody 2012-01-14
  • 打赏
  • 举报
回复
当然是第二种,
一休宗纯 2012-01-14
  • 打赏
  • 举报
回复
效率差别不是很大!
主要多做的部分是在 if()里头。
如果if里面有很多复杂的操作就可能会很慢。
如果if里头很简单,其实效率相差很微小!

你可以用一个计时器来具体测试的。

另外,那个 if() //A规则
是否是对所有的元素一样的?
如果不是一样的,则后面那个算法就错了
taodm 2012-01-14
  • 打赏
  • 举报
回复
楼主自己实测下最清楚。
对绝大部分应用,几乎没有有意义的性能差距。
jackyjkchen 2012-01-14
  • 打赏
  • 举报
回复
第二种,缓存命中率高

第一种,逻辑更清楚

两种情况,某些条件下效率大约是2倍差距
w378567402 2012-01-14
  • 打赏
  • 举报
回复
回家之前来回答你的问题,呵呵
从执行效率来说肯定是第二种效率要高,像第一种每次循环都要判断如果有1千万次循环就要判断一千万次,而第二种只要判断一次就可以了
代码风格来说第一种好一点。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧