.net 为什么我的测试winforms应用程序似乎是顺序运行的?

.net 为什么我的测试winforms应用程序似乎是顺序运行的?,.net,multithreading,winforms,vmware,windows-server-2012,.net,Multithreading,Winforms,Vmware,Windows Server 2012,我有许多VMWare Server 2012实例的规格非常高,有32个CPU,但我在运行某些应用程序时似乎存在性能问题 因此,我创建了一个.Net winforms EXE,它只需循环直到到达计数器: do { mystring = counter++.ToString(); } while (counter != loops); 我发现在我的生产服务器上,我可以在1分钟内运行120万个循环

我有许多VMWare Server 2012实例的规格非常高,有32个CPU,但我在运行某些应用程序时似乎存在性能问题

因此,我创建了一个.Net winforms EXE,它只需循环直到到达计数器:

            do
            {
              mystring = counter++.ToString();  
            } while (counter != loops);
我发现在我的生产服务器上,我可以在1分钟内运行120万个循环。然而,当我运行可执行文件的多个实例时,它只需要两倍的时间

不用说,我运行的实例越多,花费的时间就越长。例如,10次疯狂表演大约需要11分钟

当我查看CPU使用情况时: 1例=6% 10个实例=每个实例的0.5%


所以,我的问题是。。为什么服务器似乎是按顺序运行,而不是并行运行??这是一个.Net问题吗?服务器配置问题?VMware问题?

我认为这不是测试它的好方法。 基本上,您正在测试用户界面,设想用户界面只由一个内核提供服务并不疯狂

WinForm应用程序以及从中派生的东西(如WPF)专门处理一个主UI线程上的UI,如果它们试图与其他线程上的UI混在一起,则会出现竞争条件,这通常会导致随机锁定和冻结,但今天只抛出异常,这样更好。你可以在WinForm应用程序中使用多线程,但你不能触摸这些线程上的可视组件。所有可视化组件事件单击、鼠标悬停等都将在UI线程上处理

控制台应用程序可能会让你更清楚地阅读。最好是找到一个别人做过的工具,因为在衡量性能方面有很多问题,你可能会遇到这些问题

供参考:根据这样的测试得出错误的结论是不好的,例如,在VMWare、服务器或Windows中,如果你是同事,我会少想你。在这种大胆的断言中要更加谨慎,并相信问题首先在于你的测试。这是衡量绩效时最好的心态。
在你碰到同一堵墙一周或几个月后,你可能会开始质疑那些拥有庞大用户群、高度复杂的发布流程和QA的软件产品

谢谢你的回复。我之所以假设存在配置问题,是因为当我在本地硬件上运行相同的测试时,问题并不那么明显。运行1需要2.5分钟,但运行10只需要8分钟,这比功能强大得多的服务器要快。您如何计时?您应该先使用System.Diagnostics.StopWatch,然后再使用Essed.Total毫秒。我只需运行应用程序,看看需要多长时间才能完成。我的假设是,如果一套硬件需要1分钟,运行同一个应用程序两次应该只需要1分钟多一点,因为有足够的资源来处理同时运行两个简单循环的问题。耶,不要这样做。你是人类,你很混乱,你错了。让电脑来计时,永远不要相信自己。你所有的假设都将被证明是错误的。在大多数情况下,性能测试是关于质疑自己。我建议做更多的研究。尝试前往irc.freenode.net,找到一个有系统管理员的房间,并询问他们。或者在此处重新提出如何测试的问题。@user10960824每分钟1.2M的迭代速度非常慢。每秒只有20K次迭代。另一方面,您正在创建120万个必须进行垃圾收集的临时字符串。我怀疑你的时间是垃圾收集器,而不是循环服务器没有按顺序运行任何东西。每个进程都有自己的线程,操作系统会安排线程执行。如果两个线程最终被安排在同一个内核上,它们将不得不互相等待。因为您有一台服务器,所以台式机的优先级很可能低于服务,甚至可能被限制为CORE的一个子集。另一方面,您的循环不仅仅是增加一个值,而是在每次迭代时生成一个临时字符串。也就是说,一分钟内需要回收120万个临时对象。我怀疑随着循环的运行,内存使用量也会增加。您看到的性能可能只是垃圾收集,而不是循环本身。每分钟1.2米仅为每分钟20K次迭代second@panagiotis谢谢你的回复。性能监视器显示每个应用程序在多个CPU上使用4个内核,但似乎并没有使用所有可用的CPU。如何检查我的UI应用程序是否仅限于核心的一个子集。顺便说一句,“mystring”是在循环外声明的,因此它不是每次内存使用量不变时都生成新字符串。字符串是不可变的。这是一条新的绳子。请回到测量,接受你当前的结果是垃圾。@Quibblesome我不认为这与问题有什么关系。每个仪表 应用程序的核心是为处理器创建相同的工作负载。然而,该工作负载并不是均匀地分布在所有可用资源上。50%的可用CPU保持空闲。在资源分配方面,完全删除toString会产生相同的结果。