这实际上是一个两级问题。我们如何有效地从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。设备信息。制造商OUI。我们想要实现的主要目标是"Device.DeviceInfo.ManufacturerOUI"也可以是"Device.DeviceInfo.UUI"或"Device.DviceInfo.ManfOUI"等等。由于我们希望避免重新编译和更新可能有600项或更多项的代码,因此最好的方法似乎是从XML文件中进行比较(如果更明智的话,欢迎使用XML的替代品(。问题是,如何以最有效的方式实现这一点(示例代码(,以及是否有任何进一步的建议。
非常感谢。
简而言之:这里的性能问题是虚假的,从文件中读取比比较和几个分支慢很多。
实践关注:过早优化
实际上,这整件事都散发着过早优化的臭味特别是,因为您正在从文件中读取此数据。因此,如果你只是从文件中读取值,性能将主要取决于你读取文件的速度,因为:
-
文件访问(通常(比您的比较慢很多,除非它是由操作系统缓存的。
-
正确读取XML要比这些类型的比较慢得多。相对而言,快速读取XML文件仍然非常缓慢。
不要太担心性能,而是专注于一个好的设计,而不必像XML一样尝试所有酷的东西。您可以随时稍后对其进行配置并进行优化。
如果您真的希望这是快速的,我认为您可以做的主要区别是不使用XML这似乎是你项目中的一个选择,这让我进入了答案的下一部分。
设计关注点:构建您的项目
我认为你需要更多地研究建筑。您担心每次更改某些值时都必须重新构建"整个项目",但有一些合法的方法可以解决这一问题,例如将这些值存储在单独的编译单元中。然后,当您更改值并重新链接项目时,您可以重新编译该文件。他们在项目其余部分中使用的方法由您决定,但全局常量变量可能是C.的最佳方法
比较字符串
假设我们没有将值存储在单独的编译单元中。
假设您说您希望能够检查数百个可能的字符串,我认为您应该使用字符串哈希表来帮助进行检查。为每个可能的值提供键,如果某些允许的键有替代项,则表中映射的值可以包含每种类型键的唯一标识符。
例如"Device.DeviceInfo.ManufacturerOUI"one_answers"Device.DiviceInfo.UUI"都可以映射到ID DEVICE_INFO_OUI
。