А решил я производительность померять СТЛ. Правда асм в релизе не посмотрел толком. В дебаге СТЛ вообще кошмар. В дебаге велосипед в 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
}