#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int const gLoopCount = 1000000;
typedef int(*TTestProc)(char* aString);
int getUniqueCharsCount1(char* aString) {
int lResult = 0;
int lIndex;
int lStringLen = strlen(aString);
for (lIndex = 0; lIndex < lStringLen; lIndex++) {
if (strchr(aString, aString[lIndex]) == &aString[lIndex]) {
//putchar(aString[lIndex]);
lResult++;
}
}
return lResult;
}
int getUniqueCharsCount2(char* aString) {
int lResult = 0;
int lIndex;
int lStringLen = strlen(aString);
int lCharSize = sizeof(char);
int lBufferLength = 0;
char* lBuffer = (char*) calloc(256, lCharSize);
for (lIndex = 0; lIndex < lStringLen; lIndex++) {
if (!strchr(lBuffer, aString[lIndex])) {
memset(&lBuffer[lBufferLength++], aString[lIndex], lCharSize);
}
}
//printf(lBuffer);
free(lBuffer);
return lResult;
}
int getUniqueCharsCount3(char* aString) {
int lResult = 0;
int lIndex;
int lStringLen = strlen(aString);
unsigned int* lBuffer = (unsigned int*) calloc(256, sizeof(unsigned int));
for (lIndex = 0; lIndex < lStringLen; lIndex++) {
lBuffer[aString[lIndex]]++;
}
for (lIndex = 0; lIndex < 256; lIndex++) {
if (lBuffer[lIndex]) {
//putchar(lIndex);
lResult++;
}
}
free(lBuffer);
return lResult;
}
int getUniqueCharsCount4(char* aString) {
int lResult = 0;
int lIndex;
int lStringLen = strlen(aString);
unsigned int* lBuffer = (unsigned int*) calloc(256, sizeof(unsigned int));
for (lIndex = 0; lIndex < lStringLen; lIndex++) {
if (!lBuffer[aString[lIndex]]) {
lBuffer[aString[lIndex]]++;
//putchar(aString[lIndex]);
lResult++;
}
}
free(lBuffer);
return lResult;
}
void executeTestFunction(TTestProc aFunction, char* aString, char* aFunctionName) {
clock_t lClock = clock();
int lIndex;
for (lIndex = 0; lIndex < gLoopCount; lIndex++) {
aFunction(aString);
}
printf("\n%s: elapsed time is %d ticks\n", aFunctionName, clock() - lClock);
return;
}
int main(int argc, char *argv[]) {
if (argc > 1) {
executeTestFunction(getUniqueCharsCount1, argv[1], "getUniqueCharsCount1");
executeTestFunction(getUniqueCharsCount2, argv[1], "getUniqueCharsCount2");
executeTestFunction(getUniqueCharsCount3, argv[1], "getUniqueCharsCount3");
executeTestFunction(getUniqueCharsCount4, argv[1], "getUniqueCharsCount4");
}
return 0;
}