Подтвердить что ты не робот

Почему рубин настолько медленнее на окнах?

Каковы конкретные технические причины, по которым Ruby становится намного медленнее в Windows? Люди сообщают о снижении скорости в 3 раза из Linux/OSX, и есть некоторые неопределенные дискуссии о Ruby с использованием компилятора для версий Windows, которые производят медленный код, но я не могу найти никаких конкретных деталей.

Кто-нибудь знает специфику? Меня не интересует hurf durf Windoze сосет yuk yuks.

4b9b3361

Ответ 1

Я бы предположил, что есть несколько возможных вариантов, и они, вероятно, все складываются:

  • Ruby, в основном разработанный на Linux, заканчивается механически оптимизированным для него. Код регулярно протестирован для Windows, и все работает, но результат по-прежнему заключается в том, что разработчик будет тратить больше времени на оптимизацию для Linux, чем Windows.
  • По моему опыту, последние версии gcc (4.3 и выше) дают код более эффективный, чем последние версии Visual Studio (по крайней мере, 2005). Мои тесты включали в обоих случаях расходы примерно на день, найдя наилучшие варианты оптимизации кода.
  • В связи с пунктом 1, если вы скомпилируете тот же проект с использованием gcc для Windows или Linux, я обычно наблюдаю снижение производительности около 20% в Windows по сравнению с Linux. И здесь, я полагаю, это связано с тем, что Linux (или Unices в целом) является основной целью для gcc, windows - это порт. Оптимизация для Windows меньше, чем Linux.

В конце концов, если вы захотите оптимизировать Ruby для Windows, значительное время (и деньги, насколько мне известно, профилировщики на Windows не предоставляются бесплатно) придется потратить, используя профилировщик и оптимизации узких мест. И все нужно будет протестировать в Linux, чтобы убедиться, что нет потери производительности.

Конечно, все, чем нужно снова тестировать с помощью своего нового переводчика YARV.

Ответ 2

Я не очень много работал с исходным кодом интерпретатора YARV, поэтому следующие комментарии относятся только к интерпретатору 1.8.6 MIR.

В ходе попытки написать расширение C для Ruby в Visual Studio, я с ужасом обнаружил, что загружаемые двоичные файлы Windows Ruby 1.8.6 скомпилированы с использованием Visual С++ 6.0, который был выпущен вскоре после окончания Вторая мировая война. С тех пор компиляторы (и процессоры, на которые они нацелены) значительно продвинулись. В то время как сборка Linux получает новейшую gcc-доброту, Windows-сборка хромает вместе с технологией компилятора прошлого века. Это одна из причин. (Отказ от ответственности: предположительно 1.9 должен быть построен с помощью mingw, из которых я не являюсь поклонником, но который также должен быть лучше, чем VC6)

Не зная, какие операционные системы, в частности, вы обнаруживаете медленнее в Windows, трудно комментировать дальше, но я должен заметить, что я обнаружил, что реализация ввода-вывода на Ruby значительно менее эффективна как с сетевым, так и с локальным файловым вводом-выводом. Я никогда не углублялся в реализацию примитивов ввода-вывода, чтобы понять, почему, но я предполагаю, что реализации предполагают, что быстрые построения IO в Linux - это быстрые конструкции ввода-вывода в Windows, что почти всегда не так.

Ответ 3

Сначала вам нужно провести различие между более старым интерпретатором MRI (версии до 1,8) и более новым YARV, который является официальным интерпретатором для Ruby 1.9. В Ruby 1.9 есть большие улучшения производительности и другой дизайн, поэтому вам нужно знать, в какой версии вы говорите. Я предполагаю, что то, что вы прочитали, относится к версии 1.8.x, которая является единственной, у которой есть установщик с одним щелчком мыши.

Кроме того, было бы хорошо знать, если вы говорите о производительности Ruby on Rails или Ruby в целом. Я знаю, что между этими двумя должно быть четкое различие, но поскольку Ruby on Rails является основным использованием Ruby, люди часто говорят о его производительности, как будто они говорят о производительности Ruby.

Что касается компилятора, Ruby может быть построен с использованием любой новой версии Visual Studio, что более чем нормально. Я предполагаю, что если такая разница в производительности существует, нужно посмотреть на реализацию интерпретатора и посмотреть, есть ли что-то, что может повлиять на систему POSIX и Windows.

Ответ 4

Не совсем на ваш вопрос, но было замечательное обсуждение подкаста Deep Fried Bytes, в котором обсуждался тот же вопрос в контексте IronPython, Я понимаю, что ваш вопрос относится к Ruby, но могут быть связанные проблемы, которые также влияют на Ruby.

Кроме того, обсуждение неплохо выглядит немного глубже, чем "Windows отстой", поэтому стоит проверить его.

Ответ 5

Удар производительности не составляет 300%, в общем, он ближе к 50% -100%. Повседневное объяснение Джима - одна из причин, почему скрипты обработки данных медленнее в Windows по сравнению с Unix-вариантами и Linux.

В более общем случае единственное, о чем я могу думать, это то, что разработка Ruby ориентирована на Linux, что привело к появлению многих Unix -измов в способе создания Ruby. Кроме того, поскольку большинство активных разработчиков не являются пользователями Windows, в команде присутствует очень мало опыта оптимизации Windows, и большинство решений по оптимизации производительности направлены на ускорение работы в Unix-системах.

Конкретным примером этого является то, что Ruby использует передачу параметров копирования-на-запись, которая, в соответствии с тем, что я читаю, не может быть выполнена должным образом в Windows, что вызывает много накладных расходов при вызове методов.

Я не могу понять, хотя, что Casual Jim сделал, чтобы заслужить -8 голосов.

Ответ 6

ntfs автоматическое сжатие файлов в окнах замедляло все для меня. он начинает работать автоматически, когда вы находитесь на низком уровне hd..., а затем он должен распаковывать и повторно сжимать файлы "на лету", когда вы обращаетесь к ним, теряя циклы процессора.

Выполните следующую команду, чтобы распаковать весь диск ntfs из его корня (то есть "C: \" ) и посмотреть, есть ли какие-либо различия, для меня это сильно изменило и получило рубины/рельсы обратно к тому, что я используется раньше!

:

compact /u /s /i