повышение по сравнению с ACE C++ кросс-платформенное сравнение производительности?

Если вы не хотите использовать aggregate, другое решение - использовать find, а затем сортировать результаты на стороне клиента с помощью array#sort :

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

var ids = [4, 2, 8, 1, 9, 3, 5, 6];
MyModel.find({ _id: { $in: ids } }).exec(function(err, docs) {
    docs.sort(function(a, b) {
        // Sort docs by the order of their _id values in ids.
        return ids.indexOf(a._id) - ids.indexOf(b._id);
    });
});

Если значения $in являются непримитивными типами, например ObjectId s, требуется другой подход поскольку indexOf сравнивается по ссылке в этом случае.

Если вы используете Node.js 4.x +, вы можете использовать Array#findIndex и ObjectID#equals , чтобы отрегулировать это, изменив функцию sort на:

docs.sort((a, b) => ids.findIndex(id => a._id.equals(id)) - 
                    ids.findIndex(id => b._id.equals(id)));

Или с любой версией Node.js, с подчеркиванием / lodash's findIndex :

docs.sort(function (a, b) {
    return _.findIndex(ids, function (id) { return a._id.equals(id); }) -
           _.findIndex(ids, function (id) { return b._id.equals(id); });
});

20
задан Tim 11 February 2009 в 16:05
поделиться

9 ответов

Никакая библиотека не должна действительно иметь издержки по сравнению с использованием собственных средств поточной обработки ОС. Необходимо смотреть, который API является более чистым. По-моему, поток повышения API значительно легче использовать.

ACE имеет тенденцию быть большим количеством "классического OO", в то время как повышение имеет тенденцию тянуть из дизайна библиотеки стандарта C++. Например, запуск потока в ACE требует создания нового класса, полученного из ACE_Task и переопределения виртуального svc () функция, которая вызвана, когда Ваш поток работает. В повышении Вы создаете поток и выполняете любую функцию, которую Вы хотите, который значительно менее агрессивен.

27
ответ дан 29 November 2019 в 22:35
поделиться

Не волнуйтесь об издержках уровня абстракции ОС при поточной обработке и объектах синхронизации. Поточная обработка наверху буквально не имеет значения вообще (так как она только применяется к созданию потока, которое является уже чрезвычайно медленным по сравнению с издержками pimpl-ized косвенности указателя). Если Вы находите, что взаимоисключающая операция в секунду замедляет Вас, Вы - более обеспеченное рассмотрение атомарных операций или реконструкция Ваших шаблонов доступа к данным для предотвращения конкуренции.

Относительно повышения по сравнению с ACE, это - вопрос "нового стиля" по сравнению с программированием "старого стиля". Повышение имеет много основанных на шаблоне интриг только для заголовка (которые красивы для работы с, если можно ценить его). Если с другой стороны, Вы привыкнете к "C с классами" стиль C++, то ACE будет чувствовать себя намного более естественным. Я полагаю, что это - главным образом вопрос персонального вкуса к Вашей команде.

8
ответ дан 29 November 2019 в 22:35
поделиться

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

2
ответ дан 29 November 2019 в 22:35
поделиться

Я не назвал бы ACE "C с классами". ACE не интуитивен, но если Вы будете не торопиться и будете использовать платформу, как предназначено, то Вы не будете сожалеть о нем.

Из того, что я могу сказать после чтения документов Повышения, я хотел бы использовать платформу ACE и контейнерные классы Повышения.

2
ответ дан 29 November 2019 в 22:35
поделиться

Сделайте себе одолжение и держитесь подальше от ACE. Это ужасная, ужасная библиотека, которая никогда не должна была быть написана, если вы спросите меня. Я работал (или, скорее, ДОЛЖЕН работать с ним) в течение 3 лет, и я говорю вам, что это плохо спроектированный, плохо документированный, плохо реализованный кусок хлама, использующий архаичный C ++ и построенный на совершенно безумных дизайнерских решениях ... вызывающий ACE «C с классами» на самом деле делает это одолжение. Если вы посмотрите на внутренние реализации некоторых из его конструкций, вам часто будет трудно подавить рвотный рефлекс. Кроме того, я не могу подчеркнуть аспект "плохой документации" достаточно. Обычно понятие ACE о документировании функции заключается в простой печати подписи функции. Что касается значения его аргументов, его возвращаемого значения и его общего поведения, то, как правило, вам самим приходится это выяснять. Мне надоело гадать, какие исключения может выдавать функция, какое возвращаемое значение обозначает успех, какие аргументы я должен передать, чтобы функция делала то, что мне нужно, или функция / класс поточно-ориентирована или нет.

Boost, с другой стороны, прост в использовании, современный C ++, чрезвычайно хорошо документирован, и он просто РАБОТАЕТ! Ускорение - это путь, по которому надо идти с ACE!

20
ответ дан 29 November 2019 в 22:35
поделиться

Even if ACE is a kind of old school C++, it still has many thread oriented features that boost doesn't provide yet.

At the moment I see no reason to not use both (but for different purposes). Once boost provide a simple mean to implement message queues between tasks, I may consider abandoning ACE.

6
ответ дан 29 November 2019 в 22:35
поделиться

Я использую ACE в течение многих лет (8), но я только начал снова исследовать использование повышения для моего следующего проекта. Я' Тем не менее, ускорение потребует некоторой корректировки. Хотя Грег упоминает, что поддержка потоков менее инвазивна, поскольку она может запускать любую (C или статическую) функцию, если вы привыкли использовать классы потоков, которые больше похожи на классы потоков Java и C #, которые предоставляет ACE_Task, у вас есть использовать немного тонкости, чтобы получить то же самое с ускорением.

0
ответ дан 29 November 2019 в 22:35
поделиться

Я использовал ACE для множества мощных производственных серверов. Меня это никогда не подводило. Он прочный и работает уже много лет. Пытался изучить сетевой фреймворк BOOST ASIO - не смог разобраться. Хотя BOOST является более «современным» C ++, его также сложнее использовать для нетривиальных задач - и без «современного» опыта C ++ и глубоких знаний STL его трудно использовать правильно

7
ответ дан 29 November 2019 в 22:35
поделиться

Используйте ACE и boost совместно. ACE имеет лучший коммуникационный API, основанный на паттернах проектирования OO, в то время как boost имеет как бы "современный C++" дизайн и хорошо работает, например, с контейнерами.

1
ответ дан 29 November 2019 в 22:35
поделиться
Другие вопросы по тегам:

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