Ви ніби задаєте два досить різні питання:
- Чи справді Java повільна, і якщо так, чому?
- Чому Java сприймається як повільна, хоча вона швидша за багато альтернатив?
Перший з них - це більш-менш питання "як довга мотузка". Це зводиться до вашого визначення "повільно". У порівнянні з чистим перекладачем, Java надзвичайно швидка. Порівняно з іншими мовами, які (як правило) компілюються в якийсь байт-код, потім динамічно компілюється в машинний код (наприклад, C # або що-небудь інше в .NET) Java приблизно нарівні. У порівнянні з мовами, які звичайно складаються з чистого машинного коду і мають (часто великі) команди людей, які працюють ні на чому, крім вдосконалення своїх оптимізаторів (наприклад, C, C ++, Fortran, Ada), Java дуже добре справляється з кількома речами, але в цілому має тенденцію бути принаймні дещо повільніше.
Багато цього пов'язано насамперед з реалізацією - в основному, це зводиться до того, що користувач чекає, поки працює динамічний компілятор / JIT, тому, якщо у вас немає програми, яка працює досить довго, для початку важко виправдати, що компілятор витрачає багато часу на складні оптимізації. Тому більшість компіляторів Java (і C # тощо) не докладають великих зусиль для дійсно складних оптимізацій. У багатьох випадках менше стосується оптимізації, ніж де вони застосовуються. Багато проблем з оптимізацією не завершені, тому час, який вони займають, швидко зростає, коли розмір проблеми атакується. Один із способів утримати час в межах розуму - застосовувати оптимізацію лише до чогось, наприклад, однієї функції. Коли на розробник чекає лише розробник, ви можете дозволити собі зайняти набагато довше і застосувати цю саму оптимізацію до набагато більших фрагментів програми. Так само код деяких оптимізацій досить волохатий (і тому може бути досить великим). Знову ж таки, оскільки користувач чекає, поки цей код завантажується (а час запуску JVM часто є важливим фактором загального часу), реалізація повинна збалансувати час, збережений в одному місці, проти втраченого в іншому - і враховуючи, наскільки мало коду вигоди від волохатих оптимізацій, утримування JVM невеликим, як правило, вигідніше.
Друга проблема полягає в тому, що з Java ви часто отримуєте більш-менш "один розмір, який відповідає всім". Наприклад, для багатьох розробників Java Swing, по суті, є єдиною доступною бібліотекою вікон. У чомусь на зразок C ++ є буквально десятки бібліотек вікон, програмних програм тощо, кожна зі своїм набором компромісів між простотою використання та швидким виконанням, послідовним виглядом і відчуттям проти рідного вигляду та ін. Єдиним справжнім моментом є те, що деякі (наприклад, Qt) можуть бути досить дорогими (принаймні для комерційного використання).
По-третє, багато коду, написаного на C ++ (і тим більше C), просто старше і зріліше. У великій кількості він містить ядро процедур, написане десятиліттями тому, коли витрачати додатковий час на оптимізацію коду було нормальною, очікуваною поведінкою. Це часто має реальну користь у коді, який менший та швидший. C ++ (або C) отримує кредит за те, що код є малим і швидким, але це набагато більше продукту розробника і обмежень часу написання коду. До певної міри це призводить до самореалізованого пророцтва - коли люди піклуються про швидкість, вони часто вибирають C ++, оскільки він має таку репутацію. Вони вкладають додатковий час і зусилля на оптимізацію, і нове покоління швидкого C ++ коду пишеться.
Підводячи підсумок, звичайна реалізація Java робить максимальну проблему оптимізації в кращому випадку. Гірше, де видно Java , такі речі, як набори інструментів для вікон та час запуску JVM, часто грають більшу роль, ніж швидкість виконання мови в будь-якому випадку. У багатьох випадках C і C ++ також отримують заслугу за те, що насправді є продуктом просто працюючи більше при оптимізації.
Щодо другого питання, я думаю, що це багато в чому справа людської натури. Кілька завзятостей висловлюють досить завищені твердження про те, що Ява сліпуче швидка. Хтось випробовує це і виявляє, що навіть тривіальна програма потребує декількох секунд, щоб почати, і відчуває себе повільно і незграбно, коли вона працює. Мало хто, мабуть, переймається аналізом речей, розуміючи, що велика частина цього - час запуску JVM, і той факт, що, коли вони вперше випробують, ще жоден код не був складений - частина коду інтерпретується, а деякі складаються, поки вони чекають. Гірше, що навіть коли вона працює досить швидко, зовнішній вигляд зазвичай здається стороннім і незграбним для більшості користувачів, тому навіть якщо об’єктивні вимірювання показали швидкий час відгуку, він все ще здасться незграбним.
Додавання їх разом призводить до досить простої і природної реакції: що Java повільна, потворна і незграбна. Враховуючи ажіотаж, який говорить, що це дуже швидко, є тенденція до надмірної реакції та висновку, що вважають це жахливо повільним, а не (більш точним) "трохи повільніше, і це переважно за конкретних обставин". Це, як правило, найгірше для розробника, який пише перші кілька програм мовою. Виконання програми "привіт світ" на більшості мов видається миттєвим, але в Java є легко помітна пауза під час запуску JVM. Навіть чистий інтерпретатор, який працює набагато повільніше по вузьких циклах і такий, як і раніше, часто з’являється швидше для такого коду, просто тому, що він може завантажитися і почати виконуватись трохи раніше.