引続きlanguage-context-freeの話です。

AtomにはTimecopというパッケージがあって、起動時間の計測結果を表示することができます。

左側のPackage Loading, Package Activationペインに各パッケージの時間が出るのですが、language-context-freeのロードに時間が掛かっているのが気になりました。

調べていくと、AtomのディスカッションにHow To Speed Up Your Packages - Atom Discussionというpostがあって、パッケージの起動時間を改善する方法がありました。

How To Speed Up Your Packages

やり方はいつくか紹介されていたのですが、今回は"Do not require modules before activation."(activateの前にモジュールのrequireを実行しない)を適用してみました。

具体的には、ファイルの先頭にあるrequireを遅延実行するように変更しています。

[適用前]

Builder = require './models/builder'

module.exports =
  activate: (state) ->
    @builder = new Builder()

  deactivate: ->
    @builder.destroy()
    @builder = null

[適用後]

Builder = null

module.exports =
  activate: (state) ->
    Builder ?= require './models/builder'
    @builder = new Builder()

  deactivate: ->
    @builder.destroy()
    @builder = null

自分のパッケージでは、 Improve package loading and activation time · kn1kn1/language-context-free@d869d93 · GitHub が、適用分のコミットです。パッケージのメインモジュール以外にもactivateで実行されるような箇所は同様に適用しています。

以下が適用後のTimecopの結果です。language-context-freeのロードは5msec以下に改善され、Package Loadingのペインには表示されなくなりました。

おわりに

Atomというと、皆口を揃えて「起動が遅い」と仰られるのですが、原因は個々のパッケージのにあるのかもしれないですね。個々のパッケージに依存してしまいますが、この辺りが改善されるとAtom全体の起動時間の改善も期待できるのではないでしょうか。

また、Atom Blogの以下のポストでは、"Improved startup time"ということでAtom本体側の対応も紹介されているので、こちらも期待したいところですね。

Faster, Better, Stronger, and Resizable