我今天和我的一位老师有一个争论,他说CGI是总是比Servlet慢。我告诉他,性能是主观的,在某些情况下,CGI可能比Servlet表现更好。他坚持要得到CGI何时比Servlet更快的例子。我只想知道什么是我能想到的最坚实的东西来对付“Servlet是总是快于CGI”。在什么情况下CGI比Servlet更快?
回答
表现不是主观的。去查找这个词。
现在,为了回答你的问题,当执行Servlet的Java代码所需的时间足够长以至于加载和执行CGI程序的时间由Java的时间所支配时,CGI将比Servlet快程序运行。因此,举例来说,如果你有一个在C CGI程序,有
main(){ return; }
和你相比,与一个servlet,它很可能会更快。
你想要做的是建立一个servlet容器和一个CGI目录,并实际监控和衡量一些比较性能。
我怀疑即使这样会更快。你需要fork()和exec()。将其与在最可能已经产生的线程上处理请求进行比较。也许FastCGI可以在某些情况下获胜,但不是普通的CGI。 – gawi 2010-10-01 18:23:42
这真的取决于设置。正如你所说,fork/exec可能会有所作为,但是你也可能正在运行fastCGI,所以fork./exec时间被消除了。换个角度来说,如果JVM必须交换任何重要的东西来处理请求,那可能比fork/exec要多得多。重点是**表现不是主观**。如果你想知道哪个更快,* measure *。 – 2010-10-04 16:05:12
6年后....也许你可以通过电子邮件发送你的老师这样的:
“平均来说,PHP版本比ASP版快,而CGI(C++)的版本快10倍以上比PHP和ASP都好。“ (http://www.wrensoft.com/zoom/benchmarks.html)
基本上,CGI的性能会根据您实现的语言而有所不同,我怀疑一个servlet运行速度会比C++ CGI做同样的事情还要快。资源消耗在发挥重要作用时,更会受到压力。
问你的老师为什么Facebook将PHP编译成C++版本,或者谷歌和亚马逊为什么在他们的实现中使用C++。人们谈论fork()exec()开销,但不承认JVM在内部执行相同的操作。顺便说一句,JVM是用C/C++编写的。
- 1. 在什么情况下,DocumentDB更好,更快?
- 2. 在这种情况下什么会更快String.Format或String.Replace?
- 3. 在什么情况下IE8的Javascript性能会比IE7更糟?
- 4. 在什么情况下VkFence比vkQueueWaitIdle更适合vkQueueSubmit?
- 5. 在什么情况下Math.Round(...,MidpointRounding.AwayFromZero)比CInt更可取?
- 6. 在什么情况下使用json_encode()比使用serialize()更好?
- 7. 在哪些情况下,CPU直接传输的工作速度比DMA快?在什么情况下,DMA传输比CPU直接传输更快?
- 8. 在这种情况下AddRange()比ToList()更快吗?
- 9. 有什么情况下hashtable比concurrenthashmap更好?
- 10. 为什么在这种情况下,STL的priority_queue比multiset快不了多少?
- 11. 为什么两个Java线程(在某些情况下)比一个快两倍?
- 12. 什么情况更好?
- 13. 什么比innerHTML更快?
- 14. 在什么情况下有状态比网络无状态更好?
- 15. 在什么情况下可以做到 - 虽然比以前更有效率?
- 16. 静态分配在什么情况下比动态分配更好?
- 17. TextToSpeech.isSpeaking()在什么情况下返回true?
- 18. SiteLogoUrl在什么情况下工作?
- 19. sched_yield在这种情况下做什么?
- 20. .map()在这种情况下做什么?
- 21. imul在什么情况下写入edx?
- 22. 在什么情况下System.Collections.ArrayList.Add抛出IndexOutOfRangeException?
- 23. Rails after_filter在什么情况下运行?
- 24. 什么是在这种情况下
- 25. *在这种情况下做什么?:
- 26. 什么是在这种情况下
- 27. 在什么情况下document.open()返回null?
- 28. ConcurrentBag.TryTake()在什么情况下会失败?
- 29. 为什么在这种情况下
- 30. 在什么情况下调用__rmul__?
你真的很喜欢辩论。你的老师可能是正确的。尽管如此,我应该因为对“永远”这个词保持谨慎而给你信心。 – gawi 2010-10-01 18:21:21
如果您将“CGI”表示为“运行[Perl | Python | whatever]脚本”,那么他是正确的:servlet通常会在解释器启动之前完成。如果你认为它的意思是“运行一个二进制文件”,那么你肯定会发现像下面的Charlie Martin这样的例子,预编译的一段C将会很快加载和运行,这可能比servlet快得多。但是,你正在分裂头发。尽管如此,你的老师应该比使用“永远”这个词更好;) – 2010-10-01 20:23:07
这个主题可能有助于更好地理解CGI:[我从来没有真正理解:什么是CGI?](http://stackoverflow.com/questions/2089271/i-never-really-understand-what-is-cgi) – BalusC 2010-10-02 03:38:09