主要为了看一下,多个进程多表对SQL进行操作和单进程对单个表进行写数据的效率问题。 3次测试出来的数据如下 主console程序(由此进程创建21个进程) table1——table20为20个进程对20个表分别写1万条记录 table总为单进程对1个表写20万条记录 所有表中只有1个为name的char字段 数据如下 第一次: 主console程序开始时间:21分25秒 table6开始时间:21分25秒 table5开始时间:21分25秒 主console程序结束时间:21分25秒 table1开始时间:21分25秒 table2开始时间:21分25秒 table总开始时间:21分25秒 table8开始时间:21分25秒 table3开始时间:21分25秒 table4开始时间:21分26秒 table7开始时间:21分26秒 table9开始时间:21分26秒 table10开始时间:21分26秒 table12开始时间:21分26秒 table13开始时间:21分26秒 table11开始时间:21分26秒 table15开始时间:21分26秒 table18开始时间:21分26秒 table17开始时间:21分26秒 table19开始时间:21分27秒 table14开始时间:21分27秒 table20开始时间:21分27秒 table16开始时间:21分27秒 table18结束时间:22分41秒 table19结束时间:22分41秒 table14结束时间:22分41秒 table1结束时间:22分41秒 table3结束时间:22分42秒 table17结束时间:22分42秒 table2结束时间:22分42秒 table9结束时间:22分42秒 table20结束时间:22分42秒 table6结束时间:22分42秒 table13结束时间:22分59秒 table5结束时间:23分0秒 table16结束时间:23分0秒 table8结束时间:23分0秒 table7结束时间:23分0秒 table11结束时间:23分0秒 table10结束时间:23分1秒 table12结束时间:23分1秒 table15结束时间:23分1秒 table4结束时间:23分1秒 table总结束时间:24分41秒 第二次: 主console程序开始时间:27分48秒 table9开始时间:27分48秒 table2开始时间:27分48秒 table3开始时间:27分48秒 主console程序结束时间:27分48秒 table总开始时间:27分48秒 table5开始时间:27分49秒 table1开始时间:27分49秒 table6开始时间:27分49秒 table7开始时间:27分49秒 table8开始时间:27分49秒 table4开始时间:27分49秒 table12开始时间:27分49秒 table10开始时间:27分50秒 table13开始时间:27分50秒 table15开始时间:27分50秒 table16开始时间:27分50秒 table18开始时间:27分50秒 table14开始时间:27分50秒 table19开始时间:27分50秒 table11开始时间:27分50秒 table17开始时间:27分50秒 table20开始时间:27分50秒 table3结束时间:28分52秒 table9结束时间:28分53秒 table5结束时间:29分0秒 table12结束时间:29分2秒 table16结束时间:29分2秒 table19结束时间:29分2秒 table14结束时间:29分3秒 table17结束时间:29分3秒 table13结束时间:29分3秒 table4结束时间:29分3秒 table7结束时间:29分3秒 table2结束时间:29分11秒 table6结束时间:29分15秒 table11结束时间:29分15秒 table18结束时间:29分16秒 table8结束时间:29分16秒 table20结束时间:29分16秒 table10结束时间:29分17秒 table1结束时间:29分17秒 table15结束时间:29分17秒 table总结束时间:31分2秒
第三次: 主console程序开始时间:32分17秒 table12开始时间:32分17秒 主console程序结束时间:32分17秒 table17开始时间:32分17秒 table2开始时间:32分18秒 table3开始时间:32分18秒 table1开始时间:32分18秒 table总开始时间:32分18秒 table7开始时间:32分18秒 table6开始时间:32分18秒 table5开始时间:32分18秒 table4开始时间:32分18秒 table10开始时间:32分18秒 table8开始时间:32分18秒 table9开始时间:32分18秒 table11开始时间:32分18秒 table13开始时间:32分18秒 table16开始时间:32分19秒 table20开始时间:32分19秒 table15开始时间:32分19秒 table14开始时间:32分19秒 table18开始时间:32分19秒 table19开始时间:32分19秒 table17结束时间:33分19秒 table2结束时间:33分24秒 table1结束时间:33分28秒 table10结束时间:33分29秒 table20结束时间:33分30秒 table9结束时间:33分30秒 table6结束时间:33分31秒 table14结束时间:33分31秒 table11结束时间:33分31秒 table18结束时间:33分31秒 table13结束时间:33分31秒 table12结束时间:33分36秒 table3结束时间:33分41秒 table5结束时间:33分43秒 table16结束时间:33分43秒 table7结束时间:33分43秒 table4结束时间:33分43秒 table19结束时间:33分44秒 table15结束时间:33分44秒 table8结束时间:33分44秒 table总结束时间:35分40秒
从数据可以看出来,21个进程同时写40万条记录大约需要3分钟多点的时间。 20个进程同时写的时间只比1个进程写快2分钟左右,当然这样测试是很不准确的,因为21个进程同时开,那单独写20万数据的进程所分配到的CPU时间片是很少的。 机器为512M,2.4G 也可以测试其它方面的,只要把程序稍微改动一下就可以。 程序B主控,程序A是用来开20个进程的,程序C是用来开1个进程的。
代码我都贴在下面 // DataAccess.h: interface for the CDataAccess class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_DATAACCESS_H__BE165B0F_3E92_44BC_9C3B_6F4CC36AD153__INCLUDED_) #define AFX_DATAACCESS_H__BE165B0F_3E92_44BC_9C3B_6F4CC36AD153__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include <assert.h> #include <iostream> #include <string> using namespace std;
#define READ_ONLY 1 #define WRITE_ONLY 2 #define READ_WRITE 3
template<typename Container, typename ValueType, int nPropType> class CProperty { public: CProperty() { m_cObject = NULL; Set = NULL; Get = NULL; } //设置属性所在的对象指针 void setContainer(Container* cObject) { m_cObject = cObject; } //设置set指针,用来修改属性用 void setter(void (Container::*pSet)(ValueType value)) { if((nPropType == WRITE_ONLY) || (nPropType == READ_WRITE)) Set = pSet; else Set = NULL; } //设置get指针,用来读取属性用 void getter(ValueType (Container::*pGet)()) { if((nPropType == READ_ONLY) || (nPropType == READ_WRITE)) Get = pGet; else Get = NULL; } //重载=操作符,用于实现这样的操作 CAdoConnection.Connected = TRUE; //注意CAdoConnection.Connected其实是一个CProperty的对象 //属性的实现关键在于重载=操作符和隐式转换操作符 //重载后调用CProperty的拥有者的get、set函数来达到目的 ValueType operator =(const ValueType& value) { assert(m_cObject != NULL); assert(Set != NULL); (m_cObject->*Set)(value); return value; } //重载隐式转换操作符 operator ValueType() { assert(m_cObject != NULL); assert(Get != NULL); return (m_cObject->*Get)(); } private: Container* m_cObject; //属性的拥有者 void (Container::*Set)(ValueType value); //set函数指针 ValueType (Container::*Get)(); //get函数指针 }; class CAdoConnection { public: CAdoConnection(); ~CAdoConnection(); //隐式的转换操作,不推荐使用,只是暂时类没有封装好,给客户一个方便 //使用时请确保指针在类的生命期内使用 operator _ConnectionPtr(); public: CProperty<CAdoConnection, BOOL, READ_WRITE> Connected; string ConnectingString; string UserName, PassWord; private: void SetConnected(BOOL ConnectFlag); BOOL GetConnected(); private: _ConnectionPtr m_ptrConn; friend class CAdoCommand; friend class CAdoQuery; };
class CAdoCommand { public: CAdoCommand(); ~CAdoCommand(); void Execute(); operator _CommandPtr();
public: CommandTypeEnum CommandType; string CommandText; CAdoConnection * m_AdoConnection; private: _CommandPtr m_ptrComm; }; class CAdoQuery { public: CAdoQuery(); ~CAdoQuery(); void Open(); operator _RecordsetPtr(); public: string Sql; CAdoConnection * m_AdoConnection; private: _RecordsetPtr m_ptrRec; }; #endif // !defined(AFX_DATAACCESS_H__BE165B0F_3E92_44BC_9C3B_6F4CC36AD153__INCLUDED_)
// DataAccess.cpp: implementation of the CDataAccess class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "DataAccess.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// //CAdoConnection CAdoConnection::CAdoConnection() { Connected.setContainer(this); &nbs [1] [2] [3] 下一页 [办公软件]在sybase中插入图片、PDF、文本文件 [办公软件]安装Sybase ASE [办公软件]linux指令大全(完整篇) [办公软件]Linux新手入门常用命令大全 [办公软件]在RedHat Linux 9里安装gaim0.80 [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法 [办公软件]Linux程序员必读:中文化与GB18030标准 [办公软件]linux指令大全 [办公软件]制作Linux启动盘的四种方法 [办公软件]Linux文件系统的反删除方法
|