这是我的设置:我为本地客户端计算机编写了一个.NET应用程序,它实现了一个也可以在网页上使用的功能。为了简化此示例,假设客户端安装了一个软件,他可以在其中输入一些数据并获取一些数据。
我们的想法是创建一个网页,其中包含用户输入相同数据的表单,并返回与上述相同的结果。由于该公司可用的网络服务器,第一个想法是创建一个单一的网络服务,但由于未知的原因,这被驳回。 “服务”不能作为Web服务运行,而应由PHP脚本调用。目前通过PHP中的shell_exec调用单声道应用程序来实现这一目的。
所以现在我遇到了我的应用程序的单声道端口,它工作正常,但执行时间太长。我已经删除了所有不必要的dll,方法等,但通过命令行调用应用程序 - 通过命令行参数提交所需的数据 - 大约需要700ms。我们预计每秒大约有10次点击,所以这只能在为这项任务设置大量服务器时起作用。
我认为700m与每次启动应用程序的成本有关,因为如果我只处理一次或五百次请求,它在时间方面没有太大差异(我采取原始输入,改变它每次使用“新”数据进行500次迭代并进行500次迭代。从第二次迭代开始,每次迭代处理时间下降到大约1ms)
我的下一个想法是将单声道应用程序设置为远程服务器,因此它只需要启动一次,然后可以处理传入的请求。因此,我写了另一个作为客户端的单声道应用程序。调用客户端,让客户端将数据传递给服务器并检索结果现在需要344ms。这样做比较好,但仍然比我预期的要慢,并希望它是。
然后我根据this blog post从头开始实施了一个新项目,并遇到了相同的性能问题。
问题是:我是否遗漏了与单一项目相关的内容,可以提高客户端/服务器的速度?尽管为此任务创建Web服务的想法被驳回,但是在这些情况下web服务会表现得更好(因为我不需要客户端应用程序来调用服务),尽管据说远程服务比webservices更快?
我本可以做得更清楚,但实施网络服务目前不是一种选择(请不要问为什么,我没有写出要求;)
与此同时,我已经检查过它确实是客户端的启动,它占用了远程处理场景的大部分时间。
我可以想象从命令行通过管道访问服务器,这在我的场景中非常适合。我想这可以使用套接字完成吗?
答案 0 :(得分:3)
您可以尝试使用AOT来缩短启动时间。在.NET上你可以使用ngen来实现这个目的,在单声道上只需对你的应用程序使用的所有程序集进行单声道操作。
AOT代码比JIT代码慢,但具有缩短启动时间的优势。
您甚至可以尝试使用AOT框架程序集,例如mscorlib和System。
答案 1 :(得分:1)
我认为远程处理在这种情况下不是理想的选择。然而,你想在服务器上使用单声道而不是每次启动单声道确实很有用。
您是否考虑过通过HTTP使用SOAP Web服务?这也可以帮助您实现“网页”方案。
根据我的经验,即使对您来说有点慢,自定义RESTful服务实现也比使用远程处理更容易。