Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
testCopy.cpp
Package: mysql-4.1.16-win-src.zip [view]
Upload User: romrleung
Upload Date: 2022-05-23
Package Size: 18897k
Code Size: 7k
Category:
MySQL
Development Platform:
Visual C++
- /* Copyright (C) 2003 MySQL AB
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
- #include <ndb_global.h>
- #include <NdbOut.hpp>
- #include <NdbTick.h>
- #ifdef __NDB_FORTE6
- #define HAND
- bool hand = true;
- #else
- bool hand = false;
- #endif
- struct Data7 {
- Uint32 data[7];
- #ifdef HAND
- inline Data7& operator=(const Data7 & o){
- Uint32 t0 = o.data[0];
- Uint32 t1 = o.data[1];
- Uint32 t2 = o.data[2];
- Uint32 t3 = o.data[3];
- Uint32 t4 = o.data[4];
- Uint32 t5 = o.data[5];
- Uint32 t6 = o.data[6];
- data[0] = t0;
- data[1] = t1;
- data[2] = t2;
- data[3] = t3;
- data[4] = t4;
- data[5] = t5;
- data[6] = t6;
- return * this;
- }
- #endif
- };
- struct Data25 {
- Uint32 data[25];
- };
- struct TestSignal {
- Data7 head;
- Data25 data;
- };
- Uint32 g_time = 3000;
- Uint32 g_count = 8*2048;
- TestSignal g_signal;
- TestSignal * g_jobBuffer;
- template<Uint32 LEN>
- inline
- void
- MEMCOPY(Uint32 * to, const Uint32 * from){
- Uint32 t0 ;
- Uint32 t1 ;
- Uint32 t2 ;
- Uint32 t3 ;
- Uint32 len = LEN;
- while(len > 4){
- t0 = from[0];
- t1 = from[1];
- t2 = from[2];
- t3 = from[3];
- to[0] = t0;
- to[1] = t1;
- to[2] = t2;
- to[3] = t3;
- to += 4;
- from += 4;
- len -= 4;
- }
- //ndbout_c("len = %d", len);
- t0 = from[0];
- t1 = from[1];
- t2 = from[2];
- switch(len & 3){
- case 3:
- //ndbout_c("3");
- to[2] = t2;
- case 2:
- //ndbout_c("2");
- to[1] = t1;
- case 1:
- //ndbout_c("1");
- to[0] = t0;
- }
- }
- inline
- void
- MEMCOPY_NO_WORDS(Uint32 * to, const Uint32 * from, Uint32 len){
- Uint32 t0 ;
- Uint32 t1 ;
- Uint32 t2 ;
- Uint32 t3 ;
- while(len > 4){
- t0 = from[0];
- t1 = from[1];
- t2 = from[2];
- t3 = from[3];
- to[0] = t0;
- to[1] = t1;
- to[2] = t2;
- to[3] = t3;
- to += 4;
- from += 4;
- len -= 4;
- }
- //ndbout_c("len = %d", len);
- t0 = from[0];
- t1 = from[1];
- t2 = from[2];
- switch(len & 3){
- case 3:
- //ndbout_c("3");
- to[2] = t2;
- case 2:
- //ndbout_c("2");
- to[1] = t1;
- case 1:
- //ndbout_c("1");
- to[0] = t0;
- }
- }
- inline
- void
- copy1(Uint32 i, TestSignal & ts){
- TestSignal & dst = g_jobBuffer[i];
- Uint32 t0 = ts.head.data[0];
- Uint32 t1 = ts.head.data[1];
- Uint32 t2 = ts.head.data[2];
- Uint32 t3 = ts.head.data[3];
- Uint32 t4 = ts.head.data[4];
- Uint32 t5 = ts.head.data[5];
- Uint32 t6 = ts.head.data[6];
- dst.head.data[0] = t0;
- dst.head.data[1] = t1;
- dst.head.data[2] = t2;
- dst.head.data[3] = t3;
- dst.head.data[4] = t4;
- dst.head.data[5] = t5;
- dst.head.data[6] = t6;
- }
- inline
- void
- copy2(Uint32 i, TestSignal & ts){
- TestSignal & dst = g_jobBuffer[i];
- Uint32 t0 = ts.head.data[0];
- Uint32 t1 = ts.head.data[1];
- Uint32 t2 = ts.head.data[2];
- Uint32 t3 = ts.head.data[3];
- dst.head.data[0] = t0;
- dst.head.data[1] = t1;
- dst.head.data[2] = t2;
- dst.head.data[3] = t3;
- Uint32 t4 = ts.head.data[4];
- Uint32 t5 = ts.head.data[5];
- Uint32 t6 = ts.head.data[6];
- dst.head.data[4] = t4;
- dst.head.data[5] = t5;
- dst.head.data[6] = t6;
- }
- inline
- void
- copy3(Uint32 i, TestSignal & ts){
- TestSignal & dst = g_jobBuffer[i];
- dst.head = ts.head;
- }
- inline
- void
- copy4(Uint32 i, TestSignal & ts){
- TestSignal & dst = g_jobBuffer[i];
- memcpy(&dst.head.data[0], &ts.head.data[0], sizeof(Data7));
- }
- inline
- void
- copy5(Uint32 i, TestSignal & ts){
- TestSignal & dst = g_jobBuffer[i];
- MEMCOPY_NO_WORDS(&dst.head.data[0], &ts.head.data[0], 7);
- }
- inline
- void
- copy6(Uint32 i, TestSignal & ts){
- TestSignal & dst = g_jobBuffer[i];
- MEMCOPY<7>(&dst.head.data[0], &ts.head.data[0]);
- }
- inline
- void
- copy7(Uint32 i, TestSignal & ts){
- TestSignal & dst = g_jobBuffer[i];
- #if (__GNUC__ >= 3 ) || (__GNUC__ == 2 && __GNUC_MINOR >= 95)
- __builtin_memcpy(&dst.head.data[0], &ts.head.data[0], sizeof(Data7));
- #else
- dst.head = ts.head;
- #endif
- }
- template<void (* C)(Uint32 i, TestSignal & ts)>
- int
- doTime(Uint32 ms){
- Uint64 ms1, ms2;
- const Uint32 count = g_count;
- for(Uint32 i = 0; i<count; i++)
- C(i, g_signal);
- for(Uint32 i = 0; i<count; i++)
- C(i, g_signal);
- Uint32 laps = 0;
- ms1 = NdbTick_CurrentMillisecond();
- do {
- for(int j = 100; j>= 0; j--)
- for(Uint32 i = 0; i<count; i++){
- C(i, g_signal);
- }
- ms2 = NdbTick_CurrentMillisecond();
- laps += 100;
- } while((ms2 - ms1) < ms);
- return laps;
- }
- template<void (* C)(Uint32 i, TestSignal & ts)>
- void doCopyLap(Uint32 laps, const char * title){
- Uint64 ms1, ms2;
- const Uint32 count = g_count;
- for(Uint32 i = 0; i<count; i++)
- C(i, g_signal);
- laps--;
- for(Uint32 i = 0; i<count; i++)
- C(i, g_signal);
- laps--;
- Uint32 div = laps;
- ms1 = NdbTick_CurrentMillisecond();
- while(laps > 0){
- for(Uint32 i = 0; i<count; i++){
- #if (__GNUC__ == 3 && __GNUC_MINOR >= 1)
- _builtin_prefetch(&g_jobBuffer[i], 1, 0);
- #endif
- C(i, g_signal);
- }
- laps--;
- }
- ms2 = NdbTick_CurrentMillisecond();
- ms2 -= ms1;
- Uint32 diff = ms2;
- ndbout_c("%s : %d laps in %d millis => %d copies/sec",
- title, div, diff, (1000*div*g_count+(diff/2))/diff);
- }
- int
- main(int argc, const char ** argv){
- if(argc > 1)
- g_count = atoi(argv[1]);
- if(argc > 2)
- g_time = atoi(argv[2]);
- ndbout_c("Using %d entries => %d kB ",
- g_count,
- g_count * sizeof(TestSignal) / 1024);
- ndbout_c("Testing for %d ms", g_time);
- ndbout_c("Using %s copy-constructor",
- (hand ? "hand written" : "compiler generated"));
- g_jobBuffer = new TestSignal[g_count + 1];
- for(int i = 0; i<10; i++)
- memset(g_jobBuffer, 0, g_count * sizeof(TestSignal));
- int laps = doTime<copy2>(g_time);
- ndbout_c("Laps = %d", laps);
- doCopyLap<copy2>(laps, "4 t-variables");
- doCopyLap<copy3>(laps, "copy constr. ");
- doCopyLap<copy1>(laps, "7 t-variables");
- doCopyLap<copy4>(laps, "mem copy ");
- doCopyLap<copy5>(laps, "mem copy hand");
- doCopyLap<copy6>(laps, "mem copy temp");
- doCopyLap<copy7>(laps, "mem copy gcc ");
- delete[] g_jobBuffer;
- return 0;
- }