我今天和我的一位老師有一個爭論,他說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. 在下列情況下哪個更快?
- 4. 在什麼情況下使用json_encode()比使用serialize()更好?
- 5. 在什麼情況下VkFence比vkQueueWaitIdle更適合vkQueueSubmit?
- 6. 在什麼情況下Math.Round(...,MidpointRounding.AwayFromZero)比CInt更可取?
- 7. 在什麼情況下IE8的Javascript性能會比IE7更糟?
- 8. 爲什麼在這種情況下枚舉比HashMap更有用?
- 9. 在哪些情況下,CPU直接傳輸的工作速度比DMA快?在什麼情況下,DMA傳輸比CPU直接傳輸更快?
- 10. 在這種情況下AddRange()比ToList()更快嗎?
- 11. 有什麼情況下hashtable比concurrenthashmap更好?
- 12. 爲什麼在這種情況下,STL的priority_queue比multiset快不了多少?
- 13. 爲什麼兩個Java線程(在某些情況下)比一個快兩倍?
- 14. 爲什麼在某些情況下,字典的計數比collection.Counter快?
- 15. 在這種情況下,Regex比數組比較快嗎?
- 16. Scala 2.10.0編譯器在哪種情況下可能比2.9.2更快或更慢?
- 17. 爲什麼,在什麼情況下,我們應該在spring mvc中使用多個servlet而不是單個servlet?
- 18. 什麼情況更好?
- 19. 什麼比std :: pow更快?
- 20. 什麼比innerHTML更快?
- 21. 在這種情況下,Perl會用什麼來比較?
- 22. 在什麼情況下有狀態比網絡無狀態更好?
- 23. 在什麼情況下使用運算符演變比混淆更有用?
- 24. 在什麼情況下可以做到 - 雖然比以前更有效率?
- 25. 在什麼情況下比絕對定位更適合(反之亦然)?
- 26. 在什麼情況下調用__rmul__?
- 27. fgets()在什麼情況下卡住了?
- 28. 在什麼情況下document.open()返回null?
- 29. 在什麼情況下CopyOnWriteArrayList適合?
- 30. 爲什麼在這三種情況下
你真的很喜歡辯論。你的老師可能是正確的。儘管如此,我應該因爲對「永遠」這個詞保持謹慎而給你信心。 – 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