SublimeText から knife solo コマンドを実行できる plugin 書いて嬉々として使ってたわけなのですが
- SublimeKnifeSolo - SublimeText の Command Palette から knife solo を実行できる Plugin を書いたでござる
- amazedkoumei / SublimeKnifeSolo | Github
どうにも調子がよろしくない。
plugin がやっていることはといえば
- 事前登録した knife solo コマンドの保存
- knife solo コマンドの実行
- knife solo コマンド の stdout, stderr を SublimeText の view に表示
と、ただこれだけなのですが、3 の stdout, stderr 表示時の CPU Usage が異様に高く、遂には SublimeText が応答なしになるケースもありまして、ああこれはいけないね、と。
使ってるくれてる方に申し訳ないことしたな、何人くらい使ってるのかなと wbond.net の Sublime Text Packages community に行って "knifesolo" と検索してみたところ、 1 Install と表示されました。おれやんけ。
対策
reduce cpu-usage when display stream returned by knife solo command
- SublimeKnifeSolo.py
- stdout_queue, stderr_queue にknife solo コマンドが stream で返した文字列を行区切りで貯めこんでいます。
- 上記文字列の view への表示タイミングを下記のように修正
- 修正前: 1行ごと
- 修正後: stream が途切れたタイミングでまとめて表示
- helper.py
- ちょっと実装が気になったのでついでに直しただけです。
- view に文字列を1回出力するごとに read_only 属性を off にして on にして、としてたんだけど、まぁいらないよね、それ、と。
- ちょっと実装が気になったのでついでに直しただけです。
high cpu usage の原因
受け取った stream を順次てけてけてけと view に表示してました。
- 文字列を view の末尾に追加
- 文字列の高さが view の高さを超えた場合は、差を計算して view をスクロール
この 2 の「差を計算して view をスクロール」が helper.py 内のこの実装なのですが
def scroll(self):
(cur_row, _) = self.view.rowcol(self.view.size())
self.view.show(self.view.text_point(cur_row, 0))
これが異様にリソース食ってた。
これを軽くする方法がわからなかったので呼び出し回数を減らして上記の対策のようになりましたよっと。
ちなみに
def scroll(self):
self.view.show(self.view.size())
と書いても同じ動作を実現できて、cpu usage も変わりませんよっと。
以上です!