使用list :: size()后运行时间显着增加

时间:2015-01-03 01:08:50

标签: c++ list

我的代码很大。我最近添加了一些新代码,它工作正常,直到我添加了一个新的简单if语句。添加此add语句后,运行时增加了100倍,这是无意义的。

我的代码的某些部分如下。 if语句被添加到terminate_ongoing函数中,即使我删除if语句中的所有内容,程序仍然很慢。但如果我评论这个if语句,它会再次变快。

if语句是

if ( emitted_vulnerable_list.size() > 100000 ){
}

如您所见,我删除了内部的所有内容,但问题仍未解决。能否提供一些提示,找出问题的根源并解决问题。

class flip_flop_vulnerable_time{
public:
   list <vulnerable_time> emitted_vulnerable_list;
   list <vulnerable_time> ongoing_vulnerable_list;


   void terminate_ongoing(int PO, int minimum_delay , int cycle, long long elimination_time){
     for (list<vulnerable_time>::iterator it=ongoing_vulnerable_list.begin(); it!=ongoing_vulnerable_list.end(); it++){
       if ( it-> PO_signal_number == PO && it->cycles_passed == cycle && it->min_delay == minimum_delay ){
         it-> elimination_time = elimination_time;
         if ( cycle == 0 && elimination_time - it->appearance_time < 500 )
           ongoing_vulnerable_list.erase(it);
         else{
           emitted_vulnerable_list.splice(emitted_vulnerable_list.end(),ongoing_vulnerable_list, it);
           if ( emitted_vulnerable_list.size() > 100000 ){
           }
         }
         return;
       }
     }
     cout<<"\tError: can't find the following ongoing vulnerable_time object"<<endl;
     exit(0);
   }

   // Some other functions here
};

2 个答案:

答案 0 :(得分:3)

gcc中的list :: size()实现是O(n),在大型列表中,多次调用此函数可能非常耗时。

答案 1 :(得分:1)

list :: size()的问题在于您正在使用list :: splice(),除非计算移动的项目,否则无法跟踪列表大小。但使用两个变量手动跟踪尺寸并不难。