Ruby on Rails является медленным …?

Ваш первый пример не делает то, что вы намерены делать. Поскольку ptr передается по значению, указатель вызывающего не будет изменен. Поэтому, если my_condition равно true, у вызывающей стороны есть указатель, который указывает на удаленный объект, и адрес, по которому сохраняется вновь созданный объект, теряется после возврата из функции.

Вот ваш первый исправленный пример (теперь аргумент является ссылкой на указатель):

void conditional_reassign((MyClass*)& ptr)
{
    if (my_condition)
    {
        delete ptr;
        ptr = new MyClass(new_param);
    }
}

Чтобы использовать unique_ptr, вы также можете использовать ссылки и ничего не возвращать. Таким образом, нет необходимости иметь дело с std::move

void conditional_reassign2(std::unique_ptr<MyClass>& ptr)
{
    if (my_condition)
    {
        ptr =  std::make_unique<MyClass>(new_param);
    }
}

Вы можете назвать это так:

std::unique_ptr<MyClass> ptr = make_unique<MyClass>(old_param);
conditional_reassign2(ptr);

Или вы можете использовать семантику возврата / перемещения:

std::unique_ptr<MyClass> conditional_reassign(std::unique_ptr<MyClass> ptr)
{
    if (my_condition)
    {
        return std::make_unique<MyClass>(new_param);
    }

    return ptr;
}

И назовите это так:

std::unique_ptr<MyClass> ptr = make_unique<MyClass>(old_param);
ptr = conditional_reassign2(std::move(ptr));
7
задан Giann 20 February 2009 в 11:26
поделиться

9 ответов

Я соглашусь со всеми остальными. Необходимо представить. Нет никакого смысла в выполнении ничего к Вашему коду, пока Вы не знаете то, что конкретно вызывает замедление. Попытка к решению проблемы, не понимая причины похожа на плохое ощущение себя и решением перенести большую операцию, пока Вы не чувствуете себя лучше. Диагностируйте свою проблему сначала. Это могло бы быть что-то маленькое как параметр сети, или это могла быть одна плохая строка в Вашем коде.

Некоторые подсказки для профилирования:

Как представить Ваше приложение направляющих

Приложения направляющих тестирования производительности

В штамповочном прессе - профильные приложения направляющих

После того как Вы нашли узкое место, можно выяснить, что сделать.

Я рекомендую эти видео: Railslab Масштабирующиеся направляющие

Пересмотренный теперь на основе результатов профессора:

Хорошо. Теперь, когда Вы видите, что Ваша проблема состоит в том, что Вы делаете своего рода вычисление с помощью запроса на основе цикличного выполнения через результаты другого активного рекордного запроса, я советовал бы Вам изучать создание пользовательского SQL-оператора, комбинирующего Ваши начальные критерии выбора и вычисление цикла для получения то, в чем Вы нуждаетесь. Можно определенно ускорить это путем оптимизации SQL.

17
ответ дан 6 December 2019 в 05:39
поделиться

Сколько из тех 0-10ms запросов выполняется на доступ представления? На какие части Вашей модели данных ссылаются? Вы использование: включать для получения нетерпеливой загрузки на ассоциациях?

Направляющие являются столь медленными, как Вы делаете его. С пониманием прибывает скорость (обычно!)

Подробно останавливаясь на вышеупомянутом, сделайте у Вас есть has_many ассоциации, где, в частности, Ваше представление ссылается на сторону "многих" без :include? Это вызывает Ваш find(:all) на основной таблице, которая будет выполняться с соединением к детали - если Вы имеете большие количества подробных записей и обрабатываете всех их индивидуально, это может стать дорогим.

Что-то вроде этого:

Master.find(:all, :include => :details)

... мог бы помочь. Все еще предполагая от редкой информации, все же.

Существует старый Railscast на предмете здесь

5
ответ дан 6 December 2019 в 05:39
поделиться

Это не нормально. У Вас есть некоторая логика, которая замедляет Вас. Попытка комментирования остатков Вашего кода, что Вы думаете, занимает много времени и видит, помогает ли это. Если это делает, чем необходимо выяснить, как оптимизировать ту логику.

Из Вас делают большое вычисление по итерации цикла через очень большое количество объектов, затем конечно, это будет медленно.

Эти типы проблем могут подойти на любом языке или платформе. В то время как Ruby не с такой скоростью, как другие языки, это достаточно быстро большую часть времени. Если необходимо постоянно вычислять с большими наборами данных затем, Ruby не может быть правильным языком для Вас. Изучите запись Ruby C расширение, которое обработает Ваш код дренажа производительности. Но сначала просто попытайтесь диагностировать и осуществить рефакторинг.

Наконец, проверьте RubyProf, чтобы видеть, может ли он помочь Вам найти узкое место.

4
ответ дан 6 December 2019 в 05:39
поделиться

В то время как RNR имеет репутацию быть медленным, это звучит также как экстремальное значение, чтобы быть простой проблемой с языком.

Необходимо выполнить профилировщика для определения точно, какие функции являются медленными и почему. Наиболее распространенная вещь, замедляющая веб-приложение, "n+1 проблема". Таким образом, когда у Вас есть n элементы данных в Вашей базе данных, приложение делает n отдельными запросами к базе данных вместо того, чтобы делать один запрос, который получает их. Но Вы не можете знать, пока Вы не выполняете профилировщика. рубиновый профессор является одним профилировщиком, которого я использовал.

Редактирование на основе профиля заканчивается редактирование:

Я твердо полагаю, что можно всегда удалять цикл запроса. Как Mike Woodhouse говорит, направляющие способ сделать, это должно указать отношения между Вашими таблицами с has_many или другой ассоциацией и затем позволить направляющим автоматически генерировать соединение таблицы, это ясно, быстро и "направляющие путь". Но если Вы начинаете с пустым SQL или если ассоциации не работают в этом случае, можно просто генерировать соответствующие соединения сами. И Если все остальное перестало работать, можно создать представление или денормализованную таблицу, которая содержит результаты, которые ранее были найдены через цикл. Действительно, то, что необходимо выполнить итерации через сгенерированные запросы, могло бы быть знаком, что дизайн таблицы сам имеет некоторые дефекты.

Однако при кэшировании работ результатов запроса достаточно хорошо для Вас, затем останьтесь с ним. Оптимизируйте при необходимости.

5
ответ дан 6 December 2019 в 05:39
поделиться

Предыдущие два ответа полезны, особенно с помощью контрольных инструментов производительности. Я использую Нового об/мин Пережитка, и он помог мне много в прошлом.

Однако эти виды инструментов являются действительно лучшими, когда Вы пытаетесь убыстриться от, скажем, 3 секунд до менее чем 1 секунды.

2-4 минуты для представления для рендеринга абсолютно не нормальны при любых нормальных обстоятельствах.

Вы могли показать нам некоторые свои журналы разработки для выяснения, где узкие места?

Вы включаете время, которое браузер занимает для загрузки изображений, javascripts, или других файлов в это общее измерение?

3
ответ дан 6 December 2019 в 05:39
поделиться

Время выполнения это долго заставляло бы меня подозревать сетевую проблему - возможно, запрос DNS, испытывает таймаут на основном сервере DNS?

0
ответ дан 6 December 2019 в 05:39
поделиться

Вы могли попытаться использовать JRuby или переключиться на Ruby 1.9.
Они оба должны привести к крупным повышениям производительности.
Проблема с JRuby состоит в том, что драгоценные камни, которые используют C, не будут компилировать/работать. Существуют эквиваленты Java, которые установлены приложением "драгоценного камня" jruby, но некоторые драгоценные камни просто не работают

У Вас в основном будет та же проблема с Ruby 1.9. Определенный измененный синтаксис, но основная проблема - то, что hugh сумма драгоценных камней больше не работает. Люди находятся в прогрессе обновления хотя (проверяют прогресс по http://isitruby19.com/),

0
ответ дан 6 December 2019 в 05:39
поделиться

Почему бы не выбрать все данные с упреждением и иметь Ваш для цикла находят его локально в памяти, вместо того, чтобы запросить базу данных каждый раз? 1000-е запросов для единственного представления указывают, что что-то, серьезно является неправильным с Вашим дизайном.

0
ответ дан 6 December 2019 в 05:39
поделиться

Существует некоторый хороший экран, набирает эту тему http://railslab.newrelic.com/scaling-rails

Вещи как кэширование фрагмента и использование: включайте (для предотвращения n+1), может помочь. Это кажется, что Вы уже используете memcached, итак, почему бы не завихриться URL для упреждающей выборки кэша?

0
ответ дан 6 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: