XML 作为虚拟注册表使应用程序运行缓慢
Posted
技术标签:
【中文标题】XML 作为虚拟注册表使应用程序运行缓慢【英文标题】:XML as Virtual registry makes the application work slow 【发布时间】:2011-02-12 12:45:11 【问题描述】:我正在构建一个“应用程序虚拟化”产品。我使用 XML 文件作为虚拟注册表。 从我的软件生成的虚拟应用程序访问虚拟注册表 Xml。 它运行,但运行速度非常慢。
我在每次注册表 API 调用时加载和卸载 XML,因为从父进程线程化的多个进程访问同一个注册表文件。这可能会导致应用程序运行缓慢。
谁能告诉我XML的替代方案...
【问题讨论】:
为什么要在每个注册表 API 调用中加载它?平均应用程序可能会调用 1100 亿次注册表;这种方法将非常缓慢。为什么不只在启动时加载一次,然后通过读写锁同步对它的访问? 最初我在内存中加载一次,访问它,写入它并在关闭应用程序时将其保存到辅助内存中。但是许多应用程序会创建多个进程并尝试同时访问注册表。一旦涉及到多个进程,加载在第一个进程的主内存中的注册表就会超出范围,并且不会与其他进程同步。我们需要在进程之间有一个共同的记忆才能做到这一点。 如果我要做这样的事情,我会使用真正的(嵌入式?)数据库... XML 不是为了速度。 如果您需要跨多个进程同步它,您可能应该在自己的进程(可能是服务)中托管注册表内容并使用 IPC(可能是命名管道)从虚拟化进程访问它。 Okie Luke,我不依赖注册表来为虚拟注册表编写代码。服务中的处理将导致我依赖注册表。不知道这将如何解决。我一定会分析你的解决方案。感谢您的帮助。 【参考方案1】:您可以改用数据库。它会更快。 Sqlite 轻巧而强大。
【讨论】:
【参考方案2】:如果您将其加载到内存中并从那里对其进行操作,那么您的问题就不是 XML。 分析您的应用程序以找出它花费最多时间的地方。 我想您可能会发现它大部分时间都在搜索您要访问的项目。
【讨论】:
我现在没有将它加载到内存中,因为进程间通信和进程同步与单个注册表文件。【参考方案3】:它的文本到树的转换时间。 我在我的代码中通过在所有进程中加载和解析 XML 来管理这个,只有在任何一个进程中发生写入之后。
【讨论】:
【参考方案4】:当然,您当然可以始终使用真正的注册表,它是线程安全且快速的...
否则,您必须创建一个单独的进程来管理您的虚拟 XML 注册表,将 XML 结构保存在内存中,这样它就不必一直读/写它。那么需要访问它的进程就可以使用IPC与注册进程进行通信了。
另一个想法,如果多个进程不可能一直更新注册表:将虚拟 XML 注册表保存在内存中,并在更改时将其写入磁盘,但通过后台线程异步写入。访问注册表时,首先检查文件是否被更改;如果没有,则无需重新加载。
【讨论】:
以上是关于XML 作为虚拟注册表使应用程序运行缓慢的主要内容,如果未能解决你的问题,请参考以下文章