vc6和c#性能比較
編了幾年vc.又編了幾年c#一直很好奇.這兩個性能如何.
還是寫個程序進行測試一下
vc6結構體
struct DataNode1{
int number; //學號
char name[10]; //姓名
char sex [4]; //性別
double maths; //高數
double Clan; //C語言
double english; //英語
};
如果給結構體數組賦值 .添加1000000個 顯示到列表之中 。經過測試 。vc6顯示用時 [329]秒如果采用結構體鏈表用時[333]秒
同樣的結構體 c# 添加 添加1000000個 。 顯示到列表之中 。經過測試 。 366.4559601秒
顯然 vc6比較快
這是測試的c語言 的頭文件
#define LEN sizeof(struct student_stu)
struct DataNode{
int number; //學號
char name[10]; //姓名
char sex [4]; //性別
double maths; //高數
double Clan; //C語言
double english; //英語
DataNode *Next;
};
struct DataNode1{
int number; //學號
char name[10]; //姓名
char sex [4]; //性別
double maths; //高數
double Clan; //C語言
double english; //英語
};
class CStudent{
public:
CStudent();
virtual ~CStudent();
void Add( DataNode & mNode); //添加
void Insert(const int index, DataNode& mNode);
void Clear();
void del(int number );
int Del_Node(DataNode* pHead,int back);
void showLinkToList(CListBox &mlist); //刪除
void save(); //保存
void showLinkToList(CListCtrl &mlist);
void AddToTail ( DataNode * mNode) ;
int Length();
void visit_list();
void readFileToLink(char *strFileFullName);
//排序
void InsertSort();//插入排序
void BubbleSort();//冒泡排序
void sort(); //默認排序
//private:
DataNode* First;
DataNode* Last;
int Count;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Student.cpp: implementation of the CStudent class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "data.h"
#include "Student.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CStudent::CStudent()
{
First = Last = NULL;
Count = 0;
}
CStudent::~CStudent()
{
Clear();
Count = 0;
}
void CStudent::Add( DataNode & mNode)
{
//申請新節點
/* DataNode * newNode=new DataNode();
newNode->data=str;
newNode->Next=NULL;
if(First == NULL)
{
First = newNode;
Last = First;
Count =1;
return;
}else
{
//找最後一個節點
DataNode * q = Last;
//插入到鏈表最後
q->Next=newNode;
Count ++;
}*/
if(Count == 0)
{
First = new DataNode;//新建立結點&mNode;
//開始賦值
First-> number =mNode.number; //學號
strcpy( First-> name,mNode.name); //姓名
strcpy(First-> sex,mNode.sex); //性別
First-> maths=mNode.maths; //高數
First-> Clan=mNode.Clan; //C語言
First-> english=mNode.english; //英語
First->Next = NULL;
Last = First;
}
else
{
if(Last != NULL)
{
while(Last->Next!=NULL)
{
Last =Last->Next;
}
}
Last->Next = NULL;
Last->Next =new DataNode;// &mNode;
Last = Last->Next;
Last-> number =mNode.number; //學號
strcpy( Last -> name,mNode.name); //姓名
strcpy( Last -> sex,mNode.sex); //性別
Last-> maths=mNode.maths; //高數
Last-> Clan=mNode.Clan; //C語言
Last-> english=mNode.english; //英語
Last->Next = NULL;
}
++Count;
}
void CStudent::AddToTail ( DataNode * mNode)
{
DataNode * p = mNode;
int itemno =0;
while(p!=NULL)
{
Add( mNode[itemno]);
p=p-> Next;
itemno++;
}
//沒有判斷當鏈表為空的時候!!
}
int CStudent::Length()
{
return Count;
}
//保存。你自己完成
void CStudent::save()
{
}
//清空
void CStudent::Clear()
{
DataNode* p = NULL;
while(First!=NULL)
{
p = First;
First=First->Next;
p->Next=NULL;
delete(p);
p = NULL;
}
Last = NULL;
First= NULL;
Count = 0;
}
//插入
void CStudent::Insert(const int index, DataNode& mNode)
{
if(index<Count-1)
{
DataNode* node = First;
for(int i=0;i<index;i++)
{
node = node->Next;
}
DataNode* tmp = new DataNode;
tmp->Next = node->Next;
node->Next = tmp;
tmp-> number =mNode.number; //學號
strcpy( tmp-> name,mNode.name); //姓名
strcpy(tmp-> sex,mNode.sex); //性別
tmp-> maths=mNode.maths; //高數
tmp-> Clan=mNode.Clan; //C語言
tmp-> english=mNode.english; //英語
}
else if(index == Count-1)
{
this->Add(mNode);
}
++Count;
}
void CStudent::del( int number)
{
if (First==NULL)return;//如果鏈表沒有結點,就直接輸出提示
DataNode *p=First; //初始化pGuard指針
DataNode *pGuard=First;
if (First->number==number)//如果頭結點數據符合關鍵字
{
p=First;//頭結點是待刪除結點
First=First->Next;//先連
delete p;//後斷
Last = NULL;
Count=0;
return;//結束函數運行
}
else//否則
{
while(p){
if(p->number == number){
pGuard->Next = p->Next;
free(p);
return ;
}else{
pGuard = p;
}
p = p->Next;
}
}
//若head單鏈表中有數據為t的結點,刪除之
/* if(First== NULL)return;
DataNode *p =First ;
bool bFound =false;
DataNode *node1=First;
DataNode *node2=NULL;
if (node1->number==number)
{
First=First->Next;
delete node1 ;
Count--;
if(First== NULL)
{
// delete Last;
Last = NULL;
Count=0;
}
}
else
{
node1=node1->Next;
while (node1!=NULL)
{
node2=node1;
node2=node2->Next;
if (node2->number==number)
{
node1->Next=node2->Next;
delete node2 ;
Count--;
break;
}
node1=node1->Next;
}
}
//若head鏈表中沒有數據域的值為number的結點,則輸出刪除失敗的信息
if(!bFound)
{
printf("\ndelete failure!");
}*/
}
// 刪除鏈表節點函數
int CStudent::Del_Node(DataNode* pHead,int back)
{
int i = 0;
int data;
DataNode *_node = pHead;
DataNode* pSwap;
if ((back < 1) && (NULL == _node->Next))
{
printf("刪除失敗!\n");
return 0;
}
while(i < back-1)
{
_node = _node->Next;
++i;
}
pSwap = _node->Next;
data = pSwap->number;
_node->Next = _node-> Next->Next;
free(pSwap);
return data;
}
//顯示學號到listbox
void CStudent::showLinkToList(CListBox &mlist)
{
//輸出head單鏈表
mlist.ResetContent();
CString str= "";
DataNode*p=Last;
while(p)
{
str = p->number ;
mlist.AddString(str ); //輸出結點的數據——字符串
p=p->Next;
}
}
void CStudent::showLinkToList(CListCtrl &mlist)
{
//輸出head單鏈表
mlist.DeleteAllItems();
CString str= "";
int item =0;
DataNode*p=First;
while(p)
{
str.Format("%d", p->number) ;
mlist.InsertItem(item,str ); //輸出結點的數據——字符串
mlist.SetItemText(item,1,p->name );
mlist.SetItemText(item,2,p->sex );
str.Format ("%.1f",p->maths );//輸出節點數據高數
mlist.SetItemText (item,3,str );
str.Format ("%.1f",p->Clan );//輸出節點數據C語言
mlist.SetItemText (item,4,str);
str.Format ("%.1f",p->english );//輸出節點數據英語
mlist.SetItemText (item,5,str );
item++;
p=p->Next;
}
}
/************************************************************************/
/* 遍歷鏈表 */
/************************************************************************/
void CStudent::visit_list()
{
DataNode* p = First ;
while(p)
{
printf("current_addr=[%p] son_addr=[%p] son_son_addr=[%p] \n",p,p->Next,p->Next);
p=p->Next;
}
}
//把文件的內容讀入到鏈表裏面
void CStudent::readFileToLink(char *strFileFullName)
{
Clear();//清空
if(!FileExist(strFileFullName))
{
return ;
}
char strbuf[1024];
FILE *fp;
if((fp=fopen(strFileFullName,"r"))==NULL)
{
printf("File Name Error.\n");
return ;
}
int i=0;
while(!feof(fp))
{
if(fgets(strbuf,1024,fp))
{
i++;
//寫個函數。把字符串轉換成一個數據節點;然後把數據節點add
//Add(strbuf);
}else
{
break;
}
}
fclose(fp);
return ;
}
/*
==========================
功能:直接插入排序(由小到大)
返回:指向鏈表表頭的指針
==========================
*/
void CStudent::InsertSort()
{
struct DataNode *first; /*為原鏈表剩下用於直接插入排序的節點頭指針*/
struct DataNode *t; /*臨時指針變量:插入節點*/
struct DataNode *p; /*臨時指針變量*/
struct DataNode *q; /*臨時指針變量*/
first = First->Next; /*原鏈表剩下用於直接插入排序的節點鏈表:可根據圖12來理解。*/
First->Next = NULL; /*只含有一個節點的鏈表的有序鏈表:可根據圖11來理解。*/
while (first != NULL) /*遍歷剩下無序的鏈表*/
{
/*註意:這裏for語句就是體現直接插入排序思想的地方*/
for (t=first, q=First; ((q!=NULL) && (q->number < t->number)); p=q, q=q->Next); /*無序節點在有序鏈表中找插入的位置*/
/*退出for循環,就是找到了插入的位置*/
/*註意:按道理來說,這句話可以放到下面註釋了的那個位置也應該對的,但是就是不能。原因:你若理解了上面的第3條,就知道了。*/
first = first->Next; /*無序鏈表中的節點離開,以便它插入到有序鏈表中。*/
if (q == First) /*插在第一個節點之前*/
{
First = t;
}
else /*p是q的前驅*/
{
p->Next = t;
}
t->Next = q; /*完成插入動作*/
/*first = first->Next;*/
}
return;
}
void CStudent::BubbleSort()
{
AfxMessageBox("不會寫");
}
//默認的排序
void CStudent:: sort()
{
DataNode*p3=First;
DataNode*p2,*p1,*p4,*p5;
while(p3->Next->Next!=NULL)//註意鏈表向前推進的方式
{
p2=p3->Next;
p5=p2;
p1=p2;
bool flag=false;
while(p1->Next!=NULL)//內存循環終止的條件
{
if(p5->number >p1->Next->number)//找出原鏈表中剩余節點中值最小的那個節點
{
p5=p1->Next;
p4=p1;
flag=true;
}
p1=p1->Next;
}
if(flag)//交換兩個節點的順序,值小的節點往前調
{
if(p2==p4)//此種情況為要交換順序的兩個節點相鄰
{
p2->Next=p5->Next;
p5->Next=p2;
p3->Next=p5;
}
else//這種情況為要交換的兩個節點不相鄰
{
DataNode*temp=p5->Next;
p5->Next=p2->Next;
p3->Next=p5;
p4->Next=p2;
p2->Next=temp;
}
}
p3=p3->Next;
}
}
vc6和c#性能比較