Grunt の grunt-contrib-watch を使うと CPU 使用率が上がるので spawn: false を試してみた結果

公開日: : 最終更新日:2014/05/05 JavaScript ,

grunt-contrib-watch を使うことで、ユニットテストを実行したり、サイトをリロードしたりすることができます。

その恩恵にあずかり、手間が減って作業効率は上がっているんですが、CPU 使用率も上がっています。
CPU 使用率を下げるために、簡単に試せる方法があったのでその結果をメモしておきます。

icatch-load_6161289029_mini

photo credit: staffan.scherz via photopin cc

目次

1. 検証方法

何を検証したかというと、watch タスクのオプション spawn: false です。

“grunt watch 遅い” とかで検索すると、次のページにこの方法が載っていました。

他にも grunt-contrib-watch ではなく grunt-este-watch を使う方法が見つかったのですが、spawn:false のほうがお手軽だったので、まずはこちらを試してみました。

設定は、Gruntfile.js を次のようにします。

module.exports = function(grunt) {
    grunt.initConfig({
        // パッケージファイルを読み込む
        pkg: grunt.file.readJSON('package.json'),

        // grunt-contrib-connect の設定
        connect: {
            live: { // LiveReload 用の設定
                options: {
                    hostname: 'localhost', port: 9000
                }
            }
        },

        // grunt-contrib-watch の設定
        watch: {
            live: { // LiveReload 用の設定
                // プロジェクト下のある 全 HTML, CSS, JavaScript を監視対象とする
                files: ['**/*.html', '**/*.css', '**/*.js'],
                options: {
                    spawn: false, // ← コレがその設定
                    livereload: true // 上記のファイルが更新されたらブラウザをリロードする
                }
            }
        }
    });

    // LiveReload するために必要なタスクをロードする
    grunt.loadNpmTasks('grunt-contrib-connect');
    grunt.loadNpmTasks('grunt-contrib-watch');

    // `grunt` コマンドで実行するデフォルトタスクを定義する
    grunt.registerTask('default', ['connect:live', 'watch:live']);
};

2. 検証結果

spawn:false のある・なしで、自宅と職場で試してみました。
それぞれの結果は次の通りです。

2-1. 自宅

自宅のマシンスペックは次の通りです。

home-mashine-spec

もう何年も前に買ったマシンなのでパワー不足は否めません。
メモリは6GBに増設してますが、いろいろきついです。

さて、次が spawn:false なし(デフォルト)での watch タスクが出力したログです。

$ grunt
Running "connect:live" (connect) task
Started connect web server on http://localhost:9000

Running "watch:live" (watch) task
Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...

タスクの実行自体に時間はかかっていませんが、CPU 使用率は確実に上がります。

home-spawn_default

タスクを実行したタイミングで、使用率が 100% になっています。

次に spawn:false ありの watch タスクが出力したログです。

$ grunt              
Running "connect:live" (connect) task
Started connect web server on http://localhost:9000

Running "watch:live" (watch) task
Waiting...

Reloading watch config...

Running "watch:live" (watch) task
Waiting...
>> File "Gruntfile.js" changed.

Running "watch:live" (watch) task
Completed in 0.064s at xxx - Waiting...

Reloading watch config...

Running "watch:live" (watch) task
Waiting...
>> File "Gruntfile.js" changed.

Running "watch:live" (watch) task
Completed in 0.036s at XXX - Waiting...

Reloading watch config...

Running "watch:live" (watch) task
Waiting...
>> File "Gruntfile.js" changed.

Running "watch:live" (watch) task
Completed in 0.097s at XXX - Waiting...

Reloading watch config...

Running "watch:live" (watch) task
Waiting...
>> File "Gruntfile.js" changed.

Running "watch:live" (watch) task
Completed in 0.037s at XXX - Waiting...

Reloading watch config...

Running "watch:live" (watch) task
Waiting...
>> File "Gruntfile.js" changed.

Running "watch:live" (watch) task
Completed in 0.042s at XXX - Waiting...

期待を裏切って、タスクの実行に時間がかかるようになってしまいました。

CPU 使用率も依然として 100% に達します。

home-spawn_false

100% の状態になっている時間が若干短くなった気がしなくもないですが、体感でも spawn:false にしたほうが遅いと分かりました。
これではダメです。

2-2. 職場

こっそり職場でも試してみました。

職場のマシンスペックは次の通りです。

work-mashine-spec

自宅のマシンとは比較にならないくらい高速です。

spawn:false なし(デフォルト)での watch タスクが出力したログです。

$ grunt
Running "connect:live" (connect) task
Started connect web server on http://localhost:9000

Running "watch:live" (watch) task
Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...
>> File "js\script.js" changed.
Completed in 0.001s at XXX - Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...
>> File "js\script.js" changed.
Completed in 0.000s at XXX - Waiting...

自宅同様、タスクの実行自体に時間はかかっていません。
CPU 使用率も上がりますが、全然ストレスは感じません。

work-spawn_defalut

次に spawn:false ありの watch タスクが出力したログです。

$ grunt
Running "connect:live" (connect) task
Started connect web server on http://localhost:9000

Running "watch:live" (watch) task
Waiting...
>> File "js\script.js" changed.

Running "watch:live" (watch) task
Completed in 0.028s at XXX - Waiting...
>> File "js\script.js" changed.

Running "watch:live" (watch) task
Completed in 0.027s at XXX - Waiting...
>> File "js\script.js" changed.

Running "watch:live" (watch) task
Completed in 0.033s at XXX - Waiting...
>> File "js\script.js" changed.

Running "watch:live" (watch) task
Completed in 0.031s at XXX - Waiting...
>> File "js\script.js" changed.

Running "watch:live" (watch) task
Completed in 0.040s at XXX - Waiting...
>> File "js\script.js" changed.

Running "watch:live" (watch) task
Completed in 0.033s at XXX - Waiting...

やはり、タスクの実行に時間がかかるようになりました。

CPU 使用率は、デフォルトの状態と変わりありません。

work-spawn_false

3. まとめ

spawn:false にすると改善したという記事をいくつも見かけたので試してみたのですが、結果は上記の通り期待を裏切ってくれました。

まだそれほど大量のファイルを watch させてないから逆にこのような結果になったのか、原因はちょっと分からないのですが、spawn:false では改善しないことは分かりました。

お手軽だったのに残念です。。。

次は時間をみつけて grunt-este-watch を試してみたいと思います。

4. その他の JavaScript に関する記事

その他の JavaScript に関する記事は次の通りです。
気になる記事があったらぜひチェックしてみてください!

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

icatch-exception_2482521750_mini-thumbnail

Error オブジェクトの種類と独自例外オブジェクトの作成方法

JavaScript で例外オブジェクトを扱ったことがなかったので、簡単な内容ですが例外オブジェクト

記事を読む

icatch-mist_mini

jQuery を使ってページの opacity を徐々に上げて fadeIn して見せる

仕事で HTML を使ってコンテンツをいくつか作成しました。 その際に他でも使い回しが効くスニペット

記事を読む

icatch-twins_7039449789_mini

Underscore.js の template を使うときは HTML にテンプレートを書こう

Underscore.js の template メソッドを使った select タグ生成についての

記事を読む

icatch-drill_mini

Underscore.js の template を使ってドリルダウンを実装するスニペット

先日、Underscore.js の template と each を使って JSON から se

記事を読む

icatch-darts_1543970905_mini-thumbnail

GoogleMapsAPIを使って緯度・経度からMarkerを作成する方法

GoogleMaps API(v3) を使って、指定した緯度・経度の地点に Marker を表示する

記事を読む

icatch-checklist_4439276478_mini-thumbnail

BootstrapValidator の基本的なバリデーションを試すサンプルを作成しました

TwitterBootstrap3 用のバリデーションチェックプラグイン BootstrapVali

記事を読む

icatch-googlemap_3384984991_mini-thumbnail

住所から GoogleMap を表示するサンプル

ここ直近の2プロジェクトで緯度・経度(もしくは住所)から GoogleMap を表示する要件がありま

記事を読む

icatch-browser_3376956889_mini-thumbnail

GoogleMap サンプルのプロジェクトに Grunt の LiveReload を有効にする設定を追加しました

ウチのブログで公開している GoogleMaps API を使った GoogleMap のサンプルプ

記事を読む

icatch-class_303144538_mini-thumbnail

JavaScript のクラス定義

最近 JavaScript を使う機会が増えてきて、快適にコードが書けるように環境を少しずつ整えてき

記事を読む

icatch-flag_1395019914_mini-thumbnail

GoogleMaps の JavaScript API(v3) を使って、常に1つの InfoWindow だけ表示されるように制御する

前回アップした GoogleMaps の JavaScript API (v3) を使って地図上に複

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


8 + 六 =

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑