Разумеется, моё мнение может не совпадать с вашим. Да, цифры у вас могут получаться другие. Да и воздух может быть у вас чище, но у меня цифры получились такими. Решение за вами :)

Условия измерения

Необходимо для измерений:

  • Специально разработанный для этого плагин.
  • Реальный gruntfile.js из тестовой версии нового Raptorius Web Kit (1.0.0).
  • Немного терпения.

Характеристики машины:

  • CPU: Intel Core i7-3610QM
  • RAM: 8 ГБ DDR3 1600 МГц
  • SSD: ADATA S511

Результаты небольшого теста на попугайность, которые помогут вам получить почву для сравнения машин, полученных очков и ожидаемых результатов Grunt.

Сразу оговорюсь, что использовать этот gruntfile не нужно, ибо в нём есть проблемные места, которые явно будут видны на скриншотах ниже. Используется он для поиска оптимального соотношения производительности и затраченного времени на выполнение задач. Пока всё не очень хорошо, как хотелось бы.

Всего мы рассмотрим три случая, которые я смог найти на просторах зарубежного интернета.

Вперед!

А, хотя, нет! Стоп, стоп, стоп! Без кофе — никак! Занесите его в пункт «необходимо для измерений».

Сборка проекта

В этом тесте мы будем собирать весь проект целиком от и до. Текущая карта плагинов:

/*
 * ---------------------------------------------------------------
 *  PROJECT CONFIGURATION
 * ---------------------------------------------------------------
 *
 * - Watch
 * - Sync files
 * - BrowserSync
 * - Styles:
 *   - CSSComb,
 *   - LessLint,
 *   - Less,
 *   - Autoprefixer
 *   - CSSO
 * - Scripts:
 *   - JSHint,
 *   - JSCS,
 *   - Concat
 *   - Uglify
 * - Images:
 *   - Imagemin
 * - Replace
 */

Стандартная задача

В первом случае мы объявляем всё так, как указано в документации — никакой фантазии, берём и делаем.

// Loading plugins
grunt.loadNpmTasks('grunt-autoprefixer');
grunt.loadNpmTasks('grunt-browser-sync');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-imagemin');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-csscomb');
grunt.loadNpmTasks('grunt-csso');
grunt.loadNpmTasks('grunt-jscs');
grunt.loadNpmTasks('grunt-lesslint');
grunt.loadNpmTasks('grunt-sync');
grunt.loadNpmTasks('grunt-text-replace');

// Initializing plugins
...

В итоге получаем вот такие цифры:

Стандартное объявление задач

На GitHub предлагали слегка модифицированный вариант загрузки плагинов во время определения задачи. Что же, попробуем!

На примере одной задачи выглядит это так:

grunt.registerTask('watch-styles', function(status) {
  grunt.loadNpmTasks('grunt-lesslint');
  grunt.loadNpmTasks('grunt-contrib-less');
  grunt.loadNpmTasks('grunt-autoprefixer');

  status = typeof status !== 'undefined' ? status : 'build';

  grunt.task.run([
    'lesslint',
    'less:' + status + 'CompileFiles',
    'autoprefixer:' + status + 'PrefixFiles'
  ]);
});

В итоге получаем слегка неутешительные цифры:

Альтернативное стандартное объявление задач

Довольно странный результат. Нам обещали ~1s выигрыша, но что-то пошло не так :)

Универсальный загрузчик

И вот уже слышно, как в дверь к нам ломится плагин load-grunt-tasks, который читает файл package.json и загружает плагины в соответствии с его структурой.

Наш gruntfile.js слегка похудел:

module.exports = function (grunt) {
  // Measuring the execution time
  require('time-grunt')(grunt);
  require('load-grunt-tasks')(grunt);
  ...
}

Да и в скорости слегка прибавил:

Универсальный загрузчик

Уже лучше, но на очереди ещё один способ.

Отложенная загрузка плагинов

Плагин jit-grunt (Just In Time) позволяет загружать необходимые плагины по мере их вызова в задаче.

Фактически ничего не изменилось:

module.exports = function (grunt) {
  // Measuring the execution time
  require('time-grunt')(grunt);
  require('jit-grunt')(grunt, {
    replace: 'grunt-text-replace'
  });
  ...
}

Уже лучше, но существенно ли?

Отложенная загрузка плагинов

Исходя из полученных цифр, можно сказать, что jit несущественно увеличивает скорость работы, как и load-grunt-tasks, но ожидал я куда большего.

Типичные задачи

Теперь проведем тест типичной ситуации — разработка проекта. Получается, что разработчик что-то пишет, а Grunt на лету компилирует.

Стандартная задача

Довольно неплохой результат:

Стандартная задача

Универсальный загрузчик

В среднем получается даже медленнее, чем с загрузкой плагинов описанной, как в документации:

Универсальный загрузчик

Отложенная загрузка плагинов

Даже сказать нечего — всё так же, но с маленькой поправкой:

Отложенная загрузка плагинов

Выводы

Если ваш проект подразумевает большое количество полных сборок от и до, то стоит обратить внимание на плагины jit-grunt (Just In Time) и load-grunt-tasks. Чисто визуально jit шустрее, но по цифрам как-то не скажешь, зато в консольку красиво выводится блоками.

Если же ваш проект активно развивается, и что-то часто дописывается (иначе зачем вообще Grunt?), то толку от этих двух плагинов вообще нет.