这实际上是一个二阶问题。我们如何从 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 的替代方案)文件进行这种比较。问题是,如何以最有效的方式实现这一点(示例代码),以及是否有任何进一步的建议。
非常感谢。
最佳答案
简而言之:这里的性能问题是虚假的,从文件中读取比比较和多个分支要慢得多。
实践问题:过早优化
真的,这整件事都有过早优化的味道。 特别是因为您正在从文件读取此数据。因此,如果您只是从文件中读取值,性能将主要取决于您读取文件的速度,因为:
文件访问(通常)比您的比较慢很多,除非它被操作系统缓存。
正确读取 XML 比这些类型的比较要慢很多。相对而言,快速读取 XML 文件仍然很慢。
不要太担心性能并专注于良好的设计,而不必尝试您能想到的每一个 很酷的东西,比如 XML。您可以随时对其进行概要分析并对其进行优化。
如果您真的希望它更快,我认为您可以做出的主要改变是不使用 XML。这似乎是您项目中的一个选择,这让我进入答案的下一部分。
设计关注点:构建您的项目
我认为您需要多研究一下建筑。您担心每次更改某些值时都必须重建“整个项目”,但是有一些合法的方法可以解决这个问题,例如将这些值存储在单独的编译单元中。然后,您可以在更改值并重新链接项目时重新编译该文件。他们向项目的其余部分公开的方法由您决定,但全局常量变量可能是 C 语言的最佳方式。
比较字符串
假设我们不将值存储在单独的编译单元中。
鉴于您说您希望能够检查数百个可能的字符串,我认为您应该使用字符串 hash table 来辅助此检查。 .为每个可能的值提供键,如果某些允许的键有替代项,则表中的映射值可以包含每种键类型的唯一标识符。
例如“Device.DeviceInfo.ManufacturerOUI”和“Device.DeviceInfo.OUI”都可以映射到 ID DEVICE_INFO_OUI
。
关于c - 如何从 XML 文件中读取多个值并将它们与一个值进行有效比较的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31942475/