代码B:
#include <time.h>
#include <stdio.h>
class NoSuchElementException
{};
class IllegalStateException
{};
class List
{
class Element
{
public:
const int datum;
Element* next;
inline Element(const int datum, Element* next)
:datum(datum),next(next)
{}
};
class Iter
{
Element* curr;
public:
inline Iter(Element* head)
:curr(head)
{}
inline bool hasNext()const
{
return curr != 0;
}
inline int next()
{
if(curr == 0)
throw NoSuchElementException();
const int result = curr->datum;
curr = curr->next;
return result;
}
};
Element* head;
Element* tail;
public:
inline List()
{
head = tail = 0;
}
inline bool isEmpty()
{
return head == 0;
}
void purge()
{
Element* curr = head;
Element* next;
while(curr!=0)
{
next = curr->next;
delete curr;
curr = next;
}
head = tail = 0;
}
inline void append(const int datum)
{
if(head == 0)
{
head = tail = new Element(datum,0);
}
else
{
tail->next = new Element(datum, 0);
tail = tail->next;
}
}
void extract(const int datum)
{
if(isEmpty())
throw NoSuchElementException();
Element* curr = head;
Element* pre = 0;
while(curr != 0 && curr->datum != datum)
{
pre = curr;
curr = curr->next;
}
if(curr == 0)
throw NoSuchElementException();
if(curr == head)
{
Element* next = head->next;
delete head;
head = next;
}
else
{
pre->next = curr->next;
delete curr;
}
if(curr == tail)
tail = pre;
}
void assign(List* another)
{
if(this == another)
return;
Iter* iter = another->iterator();
purge();
while(iter->hasNext())
{
append(iter->next());
}
delete iter;
}
inline Iter* iterator()
{
return new Iter(head);
}
};
int main()
{
List from,to;
const int length = 100000;
const int innerLoops = 100;
for(int i=0;i<length;i++)
from.append(i);
clock_t start,end;
double timeuse;
for(int i=0;i<3;i++)
{
printf("loop %d:\n",i);
timeuse = 0;
for(int k=0;k<innerLoops;k++)
{
to.purge();
start = clock();
for(int j=0;j<length;j++)
to.append(j);
end = clock();
timeuse+=(double)(end-start);
}
printf("append: %3.1f M/s\t",length/timeuse*innerLoops/1000);
timeuse = 0;
for(int k=0;k<innerLoops;k++)
{
to.purge();
start = clock();
to.assign(&from);
end = clock();
timeuse+=(double)(end-start);
}
printf("assign: %3.3f/s\t",innerLoops/timeuse*1000);
start = clock();
for(int j=length/2;j<(length/2+1000);j++)
to.extract(j);
end = clock();
timeuse=(double)(end-start);
printf("extract: %3.3fk/s\t",1000/timeuse);
timeuse = 0;
for(int k=0;k<innerLoops;k++)
{
to.assign(&from);
start = clock();
to.purge();
end = clock();
timeuse+=(double)(end-start);
}
printf("purge: %3.3f/s\n",innerLoops/timeuse*1000);
}
}
编译方式:
cl /G7 /O2 /arch:SSE2 list.cpp
注:我是p4,所以/G7 /arch:SSE2不是的把它去掉就是了