我需要在某些C代碼中查找字符串標識符,並且正在考慮如何對查找進行編碼。標識符和字符串在編譯時是固定的,不可能改變。我認爲索引到一個字符串數組將是最有效的 - 那就是lookup1。哪種查找方法對於簡單整數到字符串查找最有效
有時在代碼標識符不從0開始或有差距在編號如此選擇LOOKUP2用於這些情況。 lookup2使用switch語句。
另一種選擇是lookup3,它使用一個帶有整數到字符串映射的結構。
我想過的一些利弊。
LOOKUP2更加靈活,如果標識符不從零開始,或者如果有差距
如果標識符從零開始,有沒有差距則lookup1是更好?如果不是,那麼去lookup2方法?
lookup3怎麼樣?
這是遺留代碼,定義已經存在。對於新代碼,枚舉會更好嗎?
通常會有5-20個定義在一個類別中。可以有100多個。
這是代碼。
#include <stdio.h>
#define RINGING 0x0
#define DIALING 0x1
#define IDLE 0x2
#define ENGAGED 0x3
#define CONNECTED 0x4
static const char* const lookup1(int id) {
static const char* const identifiers[] = {
"RINGING",
"DIALING",
"IDLE",
"ENGAGED",
"CONNECTED" };
int size = sizeof(identifiers)/sizeof(identifiers[0]);
if (id >= 0 && id < size) {
return identifiers[id];
}
return "Unknown identifier";
}
static const char* const lookup2(int id) {
switch (id) {
case RINGING: return "RINGING";
case DIALING: return "DIALING";
case IDLE: return "IDLE";
case ENGAGED: return "ENGAGED";
case CONNECTED: return "CONNECTED";
default: return "unknown";
}
}
static const char* const lookup3(int id) {
struct id2name {
int id;
const char* const name;
};
static struct id2name pairings[] = {
{ RINGING, "RINGING" },
{ DIALING, "DIALING" },
{ IDLE, "IDLE" },
{ ENGAGED, "ENGAGED" },
{ CONNECTED, "CONNECTED" } };
int size = sizeof(pairings)/sizeof(pairings[0]);
if (id >= 0 && id < size) {
return pairings[id].name;
}
return "Unknown identifier";
}
int main() {
const int identifiers[] = { RINGING, DIALING, IDLE, ENGAGED, CONNECTED };
const int size = sizeof(identifiers)/sizeof(identifiers[0]);
for (int i = 0; i < size; ++i) {
printf("using lookup1 id %d is: %s\n", i, lookup1(i));
printf("using lookup2 id %d is: %s\n", i, lookup2(i));
printf("using lookup3 id %d is: %s\n", i, lookup3(i));
}
}
由於這是在現有的應用程序的情況下,不能只是一味的不同的變體來衡量(1)是否存在上述噪聲電平(比如,2%)的任何性能差異,(2)如果有有什麼區別,哪個變種是最快的? – njuffa
看看https://stackoverflow.com/questions/35838849/lookup-table-vs-switch-in-c-embedded-software – Zakir
什麼是標識符的最大值是多少? 5?什麼是最廣泛的標識符值0到100或什麼。如果你想要速度,更多的信息是有用的。 – chux