int main(int argc, char * *argv) { Console *console = new Console(); /* Begin your application here. */ CrissCross::Data::DArray<char *> randomStrings; CrissCross::System::Stopwatch sw; console->SetColour(console->FG_RED | console->FG_INTENSITY); console->WriteLine("CheckMark"); console->SetColour(); console->WriteLine("A checksum (hashing) algorithm benchmark."); console->WriteLine(); console->WriteLine("Note: {whatever}Marks are a measurement of how many %s\nof data were processed per second by a given hash.", #ifdef TARGET_OS_NDSFIRMWARE "kilobytes"); #else "megabytes"); #endif console->WriteLine(); /* Generate some data for checksum speed tests. */ console->Write("Generating data... "); sw.Start(); GenerateRandom(randomStrings); sw.Stop(); console->WriteLine("%5.3lfs", sw.Elapsed()); console->WriteLine(); /* This variable just makes the compiler think */ /* the data is being used somehow. */ unsigned long killOptimization = 0; sw.Start(); for (int r = 0; r < MAX_RUNS; r++) for (int i = 0; i < DATASET_SIZE; i++) { killOptimization = adler32(0, randomStrings.get(i), ENTRY_LENGTH); } sw.Stop(); console->WriteLine("%8lu AdlerMarks", (unsigned long)((double)(DATASET_SIZE * MAX_RUNS) / sw.Elapsed()), killOptimization); sw.Start(); for (int r = 0; r < MAX_RUNS; r++) for (int i = 0; i < DATASET_SIZE; i++) { killOptimization = crc32(randomStrings.get(i), ENTRY_LENGTH); } sw.Stop(); console->WriteLine("%8lu CRCMarks", (unsigned long)((double)(DATASET_SIZE * MAX_RUNS) / sw.Elapsed()), killOptimization); CrissCross::Crypto::MD4Hash md4; sw.Start(); for (int r = 0; r < MAX_RUNS; r++) for (int i = 0; i < DATASET_SIZE; i++) md4.Process(randomStrings.get(i), ENTRY_LENGTH); sw.Stop(); console->WriteLine("%8lu MD4Marks", (unsigned long)((double)(DATASET_SIZE * MAX_RUNS) / sw.Elapsed())); CrissCross::Crypto::MD5Hash md5; sw.Start(); for (int r = 0; r < MAX_RUNS; r++) for (int i = 0; i < DATASET_SIZE; i++) md5.Process(randomStrings.get(i), ENTRY_LENGTH); sw.Stop(); console->WriteLine("%8lu MD5Marks", (unsigned long)((double)(DATASET_SIZE * MAX_RUNS) / sw.Elapsed())); CrissCross::Crypto::SHA1Hash sha1; sw.Start(); for (int r = 0; r < MAX_RUNS; r++) for (int i = 0; i < DATASET_SIZE; i++) sha1.Process(randomStrings.get(i), ENTRY_LENGTH); sw.Stop(); console->WriteLine("%8lu SHA1Marks", (unsigned long)((double)(DATASET_SIZE * MAX_RUNS) / sw.Elapsed())); CrissCross::Crypto::SHA256Hash sha256; sw.Start(); for (int r = 0; r < MAX_RUNS; r++) for (int i = 0; i < DATASET_SIZE; i++) sha256.Process(randomStrings.get(i), ENTRY_LENGTH); sw.Stop(); console->WriteLine("%8lu SHA256Marks", (unsigned long)((double)(DATASET_SIZE * MAX_RUNS) / sw.Elapsed())); CrissCross::Crypto::SHA512Hash sha512; sw.Start(); for (int r = 0; r < MAX_RUNS; r++) for (int i = 0; i < DATASET_SIZE; i++) sha512.Process(randomStrings.get(i), ENTRY_LENGTH); sw.Stop(); console->WriteLine("%8lu SHA512Marks", (unsigned long)((double)(DATASET_SIZE * MAX_RUNS) / sw.Elapsed())); CrissCross::Crypto::TigerHash tiger; sw.Start(); for (int r = 0; r < MAX_RUNS; r++) for (int i = 0; i < DATASET_SIZE; i++) tiger.Process(randomStrings.get(i), ENTRY_LENGTH); sw.Stop(); console->WriteLine("%8lu TigerMarks", (unsigned long)((double)(DATASET_SIZE * MAX_RUNS) / sw.Elapsed())); randomStrings.flushArray(); console->WriteLine(); /* End your application here. */ #ifdef TARGET_OS_WINDOWS system("pause"); #endif delete console; return 0; }
int RunApplication(int argc, char * *argv) { Console *console = new Console(); /* Begin your application here. */ #ifdef ENABLE_CPUID CPUID *cpuid = new CPUID(); console->SetColour(console->FG_RED | console->FG_INTENSITY); console->WriteLine("======================"); console->WriteLine("= CPU IDENTIFICATION ="); console->WriteLine("======================"); console->SetColour(0); console->WriteLine(); cpuid->Go(); /* NOTES */ /* The Virtual count is the number of processors that the operating system sees, */ /* but does not take into account whether any of the processors counted are */ /* hyperthreads, cores, or truly physical CPUs. */ /* */ /* If the Physical and Logical counts are equal, the number of Physical/Logical is the */ /* core count, because it's a dual core system. */ console->WriteLine("There are %d processors in the system (%d cores per package, %d logical per package).", cpuid->VirtualCount(), cpuid->CoresPerPackage(), cpuid->LogicalPerPackage()); if (cpuid->VirtualCount() > 1 || cpuid->CoresPerPackage() > 1 || cpuid->LogicalPerPackage() > 1) { if (cpuid->CoresPerPackage() == cpuid->LogicalPerPackage()) console->WriteLine("This is a multi-core system."); else if (cpuid->CoresPerPackage() > 1 && cpuid->LogicalPerPackage() > cpuid->CoresPerPackage()) console->WriteLine("This is a hyperthreaded multi-core system."); else if (cpuid->CoresPerPackage() == 1 && cpuid->LogicalPerPackage() > 1) console->WriteLine("This is a hyperthreaded system."); if (cpuid->VirtualCount() > cpuid->LogicalPerPackage()) console->WriteLine("This is a multi-processor system."); } else { console->WriteLine("This is a single processor system."); } /* * v32 l8 = 32/8 = 4 * v4 l2 = 4/2 = 2 * v2 l2 = 2/2 = 1 * v1 l2 = 1/2 = 0.5 */ double ratio = (double)cpuid->VirtualCount() / (double)cpuid->LogicalPerPackage(); if ((int)ratio < 1) { console->WriteLine(); console->SetColour(console->FG_YELLOW | console->FG_INTENSITY); console->WriteLine("WARNING: Expected at least 1 physical package, but detected %0.1lf. Are you\n" "running this under a hypervisor?", ratio); console->SetColour(); } console->WriteLine(); for (int i = 0; i < MAX_PROCESSORS; i++) { /* Go through each Virtual processor. */ if (cpuid->proc[i]->Manufacturer != NULL) { /* Print out the manufacturer string */ console->WriteLine("CPU[%d] Manufacturer: %s", i, cpuid->proc[i]->Manufacturer); /* Print out the CPU name string, if available. */ if (strlen(cpuid->proc[i]->ProcessorName) > 0) console->WriteLine("CPU[%d] Name: %s", i, cpuid->proc[i]->ProcessorName); /* Print out Family/Model/Stepping info. */ console->WriteLine("CPU[%d] Family: %d, Model: %d, Stepping: %d", i, cpuid->proc[i]->Family, cpuid->proc[i]->Model, cpuid->proc[i]->Stepping); /* Print out the CPU cache info. */ if (cpuid->proc[i]->caches.size() > 0) { console->WriteLine("CPU[%d] Caches:", i); for (size_t j = 0; j < cpuid->proc[i]->caches.size(); j++) { if (cpuid->proc[i]->caches.valid(j)) console->Write(" %s", cpuid->proc[i]->caches.get(j)); } console->WriteLine(); } /* Print out CPU features (MMX, SSE, and so on). */ console->Write("CPU[%d] Features: ", i); CrissCross::Data::DArray<const char *> *featureIDs = cpuid->proc[i]->features.ConvertIndexToDArray(); for (size_t i = 0; i < featureIDs->size(); i++) { if (featureIDs->valid(i)) console->Write("%s ", featureIDs->get(i)); } delete featureIDs; console->WriteLine(); console->WriteLine(); } } delete cpuid; #else console->WriteLine("CPUID isn't supported on your platform or compiler."); #endif /* End your application here. */ #ifdef TARGET_OS_WINDOWS system("pause"); #endif delete console; return 0; }