gcc (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2)
c89
你好,優化解析器函數的C程序
我想知道如果我可以再優化該代碼。由於這是在一個快速的事務服務器中,它每秒會有很多呼叫。所以解析器必須非常快速和優化。
我在想我是否有任何改進。
包含測試用例的完整代碼。函數g_get_dnis_user_part
是我想要優化的。
我希望這是發佈到的正確論壇。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
static int g_get_dnis_user_part(const char *dnis, char *user_part, size_t size);
int main(void)
{
/* Test cases */
const char *dnis_test1 = "[email protected]";
const char *dnis_test2 = "084637257310.1.8.34";
const char *dnis_test3 = "[email protected]";
const char *dnis_test4 = "";
const char *dnis_test5 = "[email protected]";
size_t passes = 0;
size_t failures = 0;
#define MAX_ADDRESS_LEN 32
char user_part[MAX_ADDRESS_LEN];
memset(user_part, 0, sizeof user_part);
if(g_get_dnis_user_part(dnis_test1, user_part, MAX_ADDRESS_LEN) == TRUE) {
printf("TEST 1 PASSED [ %s ] [ %s ]\n", dnis_test1, user_part);
passes++;
}
else {
printf("TEST 1 FAILED [ %s ] [ %s ]\n", dnis_test1, user_part);
failures++;
}
memset(user_part, 0, sizeof user_part);
if(g_get_dnis_user_part(dnis_test2, user_part, MAX_ADDRESS_LEN) == TRUE) {
printf("TEST 2 PASSED [ %s ] [ %s ]\n", dnis_test2, user_part);
passes++;
}
else {
printf("TEST 2 FAILED [ %s ] [ %s ]\n", dnis_test2, user_part);
failures++;
}
memset(user_part, 0, sizeof user_part);
if(g_get_dnis_user_part(dnis_test3, user_part, MAX_ADDRESS_LEN) == TRUE) {
printf("TEST 3 PASSED [ %s ] [ %s ]\n", dnis_test3, user_part);
passes++;
}
else {
printf("TEST 3 FAILED [ %s ] [ %s ]\n", dnis_test3, user_part);
failures++;
}
memset(user_part, 0, sizeof user_part);
if(g_get_dnis_user_part(dnis_test4, user_part, MAX_ADDRESS_LEN) == TRUE) {
printf("TEST 4 PASSED [ %s ] [ %s ]\n", dnis_test4, user_part);
passes++;
}
else {
printf("TEST 4 FAILED [ %s ] [ %s ]\n", dnis_test4, user_part);
failures++;
}
memset(user_part, 0, sizeof user_part);
if(g_get_dnis_user_part(dnis_test5, user_part, MAX_ADDRESS_LEN) == TRUE) {
printf("TEST 5 PASSED [ %s ] [ %s ]\n", dnis_test5, user_part);
passes++;
}
else {
printf("TEST 5 FAILED [ %s ] [ %s ]\n", dnis_test5, user_part);
failures++;
}
printf("ALL TEST COMPLETED PASSES [ %ld ] FAILURES [ %ld ]\n", passes, failures);
return 0;
}
/* Get the user part from the complete dnis number
[email protected] -> 0846372573 nul terminated */
static int g_get_dnis_user_part(const char *dnis, char *user_part, size_t size)
{
size_t i = 0;
int status = FALSE;
/* Make room for the nul terminator */
if(size > 1) {
size--;
}
else {
return status;
}
for(i = 0; i < size; i++) {
/* Check for valid digit */
if(isdigit(*dnis) != 0) {
user_part[i] = *dnis;
}
else {
if(*dnis == '@') {
/* We are at the end */
status = TRUE;
break;
}
else {
/* Not a digit or @ - corrupted dnis string */
status = FALSE;
break;
}
}
/* Next character */
dnis++;
}
/* nul terminate the string */
user_part[i++] = '\0';
/* Status FALSE indicates that the @ was not found or possible corruption with dnis string */
return status;
}
非常感謝您的任何建議,
聽起來像是更適合[CodeReview](http://codereview.stackexchange.com)。 – 2012-03-30 06:26:35
'#define TRUE 0'讓我感到恐慌。 – 2012-03-30 06:28:21
你有沒有簡介,以確保你試圖優化的功能真的是瓶頸? – RedX 2012-03-30 06:39:06