Re[8]: цели изучения STL :)
От: Programador  
Дата: 05.04.07 10:59
Оценка:
А решил я производительность померять СТЛ. Правда асм в релизе не посмотрел толком. В дебаге СТЛ вообще кошмар. В дебаге велосипед в 20 раз быстрее в релизе в 3

Чет функцию сравнения не могу в параметры шаблона засунуть. Как можно?

#include <stdio.h>
#include <list>

__declspec(naked) __int64 rdtsc()
{   __asm rdtsc;
    __asm ret;
}

typedef std::list<int> Ilist;

//  список и ноде от Ilist
struct kak_int
{  kak_int *next,*prev;
   int value;
};
struct kak_il
{  kak_int *xz,*head;
   int size;
};
inline bool operator<(kak_int const& a,kak_int const& b)
{  return a.value<b.value;
}


// сортировка односвязного списка
template <class C,C* (C::* NEXT)>
struct Vel_lis1
{  
  inline static C* merge(C* a,C* b)
  { if(!a)
       return b;
    if(!b)
       return a;
    C *x,**xx=&x;
    for(;;)
    if(*b<*a)
    {  *xx=b;
        xx=&(b->*NEXT);
       if( !(b= *xx))
       { *xx=a; 
         break;
       }
    }
    else
    {  *xx=a;
        xx=&(a->*NEXT);
       if( !(a= *xx))
       { *xx=b; 
         break;
       }
    }
    return x;
  }

  inline static int sort(C  *&_l)
  {  C *l2n[32],*l=_l,*lpp;
     int j;
     for( j=32;j--;)
       l2n[j]=0;
     for(;l;l=lpp)     
     { lpp=l->*NEXT;
       l->*NEXT=0; 
       for(int j=0;;j++)
       if(l2n[j])
         l=merge(l2n[j],l),l2n[j]=0;
       else
       { l2n[j]=l;
          break;
       }
     }
     _l=0;
     int n=0,e=1;
     for( j=0;j<32;j++,e<<=1)
     if(l2n[j])
       _l=merge(l2n[j],_l),n+=e;
     return n;
  }
};



void main(int , char* [])
{  Ilist il, ila,ilb;
   kak_il &kila=(kak_il&)ila,&kilb=(kak_il&)ilb;
   int j;


   for( j=0;j<100;j++)
     { int r=rand(); ila.push_back(r),ilb.push_back(r);     }
   
   
   __int64 klk_stl, klk_velo;  // клики стл и вело

   klk_stl=rdtsc();
   ila.sort();
   klk_stl=rdtsc()-klk_stl;
   
     
     
   klk_velo=rdtsc();
   // прревращаем в односвязный
   kilb.head->prev->next=0; 
   // сортируем односвязный
   Vel_lis1<kak_int,&kak_int::next >::sort(kilb.head->next);
   // вертаем в зад в двухсвязный
   for(kak_int *node=kilb.head,*nodepp;;node=nodepp)
   { nodepp=node->next;
     if(!nodepp)
     { kilb.head->prev=node;
       node->next=kilb.head; 
       break;
     } 
     nodepp->prev=node; 
   }

   klk_velo=rdtsc()-klk_velo;
   
   
   // проверки
   if(ila==ilb)
   {   __asm nop
      j=__LINE__;
   }
   if(ilb==ila)
   {   __asm nop
      j=__LINE__;
   }
   ila.erase(ila.begin(),ila.end());
   ilb.erase(ilb.begin(),ilb.end());


   printf(" %.0f / %.0f = %.2f \n",double(klk_stl),double(klk_velo),double(klk_stl)/double(klk_velo));
   __asm nop

}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.