这实际上是一个两个尺度的问题。我们如何有效地从XML文件中读取多个值,然后我们如何将它们与不同的值进行比较。
尽可能高效地完成这个问题是非常重要的。
以下是现有代码的示例:
if (strcasecmp(stMsgData->paramName,"Device.a.b") == 0)
{
ret = aFunction();
}
else if (strcasecmp(stMsgData->paramName,"Device.z.o") == 0)
{
ret = bFunction();
}
else if (strcasecmp(stMsgData->paramName,"Device.g.j") == 0)
{
ret = cFunction();
}
为了更好的示例,我们假设Device.a.b实际上是Device.DeviceInfo.ManufacturerOUI。我们想要实现的主要是" Device.DeviceInfo.ManufacturerOUI"也可能是" Device.DeviceInfo.OUI"或" Device.DeviceInfo.ManfOUI"等等。由于我们希望避免重新编译并更新可能600项或更多项的代码,因此最好的方法似乎是从XML(如果更明智的话,欢迎使用XML的替代方案)文件进行此比较。问题是,如何以最有效的方式实现(示例代码)以及是否有任何进一步的建议。
非常感谢提前。
答案 0 :(得分:0)
简而言之:此处的性能问题是虚假的,从文件读取的速度比比较和几个分支要慢。
真的,整个事情很糟糕过早优化。 特别是,因为您正在从文件中读取此数据。因此,如果您只是从文件中读取值,则性能主要取决于您读取文件的速度,因为:
文件访问(通常)比您的比较慢,除非它被操作系统缓存。
正确读取XML比这些类型的比较要慢得多。快速读取XML文件仍然相对较慢。
不要太担心性能并专注于一个好的设计,而不必尝试像XML一样的每个酷的东西。您可以随时对其进行分析并对其进行优化。
如果你真的想要这么快,我认为你可以做的主要区别是不使用XML 。看来这是你项目中的一个选择,这让我想到了答案的下一部分。
我认为你需要进一步研究建设。您担心每次更改某些值时都必须重建“整个项目”,但有合理的方法,例如将这些值存储在单独的编译单元中。然后,您可以在更改值并重新链接项目时重新编译该文件。他们接触到项目其余部分的方法取决于你,但全局常量变量可能是获得C的最佳方式。
假设我们不将值存储在单独的编译单元中。
鉴于您说您希望能够检查数百个可能的字符串,我认为您应该使用字符串hash table来帮助检查。为每个可能的值提供密钥,如果某些允许的密钥具有替代值,则表中的映射值可以包含每种类型密钥的唯一标识符。
e.g。 “Device.DeviceInfo.ManufacturerOUI”和“Device.DeviceInfo.OUI”都可以映射到ID DEVICE_INFO_OUI
。