gpt4 book ai didi

c++ - Windows CE 5 和 6 之间的互锁 API

转载 作者:搜寻专家 更新时间:2023-10-31 01:51:01 27 4
gpt4 key购买 nike

我目前正在将一个 VS2005 C++ 应用程序从 CE5 移植到 CE6,我遇到了严重的性能问题。到目前为止,检索动态内容的单个 HTTP 请求在 CE5 上需要 40 毫秒,在 CE6 上需要 350 毫秒。由于我已经清理了一堆效率低下的问题,这些值过去变得更糟,提高了两个系统的性能,但目前我陷入了这种延迟。作为记录,这两个测试都是在同一台机器上进行的,网络服务器不是 CE 提供的,而是用 C++ 实现的自定义服务器。另请注意,问题不在于网络 IO,在提供静态文件时,CE6 在同一台机器上的性能甚至优于 CE5,而在于动态内容处理。

在试图找出程序执行如此糟糕的原因时,我偶然发现了一些令我困惑的事情:在 CE5 下,用于 x86 的 Interlocked* API 既不使用编译器内部函数也不使用真正的函数调用,而是使用内联汇编代码。这段代码有一条评论说,内在包含锁前缀,只有多处理器系统才需要这些前缀,并且会减慢仅在 CE5 等单核上运行的代码。在 CE6 上,这些功能是使用编译器内部函数(包括锁定前缀)实现的。由于这些功能被例如使用Boost 和 STLport,两者都在网络服务器内部使用,我想知道这些是否是罪魁祸首。

我注意到的另一件事是一些字符串解析函数需要非常长的时间。更糟糕的是,似乎在第一次调用同一个函数后第二次调用花费的时间更少,所以看起来好像正在进行某种缓存。由于这是一个通过 TCP 接收并在内存中解析的短 (<1kB) 字符串,我无法想象哪个缓存对此负责。唯一的缓存可能是指令缓存,但程序不大于 CE5 版本,如果代码从未缓存的内存运行,则不会显示这些缓存效果。

TLDR - 问题:

  • CE6 是否能够处理多个处理器?
  • 有没有简单的方法告诉编译器它应该省略锁前缀?我目前实现该目标的方法是简单地从 CE5 SDK 复制内联程序集,但这太丑陋了。
  • 我也很感激任何其他建议,看什么或尝试什么。非常感谢!

总结 没有依赖于可执行文件的问题,更不用说依赖于Interlocked API了。运行相同的可执行文件证明了这一点。但是,在具有不同平台设置的不同机器上运行会有所不同。我们现在回到 Platform Builder,试图找出这两个平台之间的差异。

最佳答案

  1. 没有。 SMP 支持需要 WEC7。很可能在 CE6 中,OEM 禁用了其他内核。

  2. 据我所知没有。

  3. 要么使用 performance profiling tools或使用计时调用检测您的代码,以缩小花费时间过长的范围。

关于c++ - Windows CE 5 和 6 之间的互锁 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14346100/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com