Javaのhprofというプロファイラは、準備を必要とせず(JDK標準だから)に、CPU、ヒープ、モニタの衝突など、一通り測れる便利なプロファイラです。
特に各メソッドのカウントを「全て取る」モード(-Xrunhprof:cpu=times)は、明らかに呼び過ぎのメソッドが一発で分かるため、大変に便利です。
しかし便利な反面、実行速度が下がりすぎて使い物にならなくなる場合があります。
今日遭遇したケースは、7MBのファイルをDataInputStreamからreadByte() するプログラムです。通常のデバッグ実行であれば、ほんの一瞬で終わりますが、cpu=timesでプロファイリングすると10分経っても終わりません…。
どうも、細かいメソッドが頻繁に呼ばれすぎるせいで、メソッド呼び出しのカウントを行う部分がパンクしているようです。
思い出してみればInputStream系はInputStream -> BufferedInputStream -> DataInputStreamなどのように連鎖させるのでメソッド呼び出しが深く、データをロードするという処理はループ回数が多くなりがちなので、深さ×ループ回数の掛け算に比例してどんどん遅くなってしまいます。
これはよろしくありません。
待てるくらいの時間に収まるように、何とか軽くしてみましょう。
まず目を付けたのはreadByte() です。readByte() で1バイトつずつ読むから呼び出しカウントが多くなるわけです。ならばreadLong() で8バイトずつ読めばカウントは1/8です。
コードもちょい変えで済むし、お手軽高速化としては、プロファイリング時の実行速度もほぼ8倍になる、という中々の効果です。
しかしreadLong() を持ってしても100MBオーバーとなると厳しいでしょう。もし本当にそこまで必要なら、根底から覆す(InputStreamを使わないとか)別の手立てを考える必要がありそうです。
私のスマホは防水だけど、その意味は雨でも壊れない、であって、雨でも使える、って意味ではないんだなあ。
なぜなら、タッチパネルに水滴が着くとまともに動かないからです…。
メモ: 技術系の話はFacebookから転記しておくことにした。
ARMアーキテクチャを表すときARMv5Tがあって、ARMv6Tがないのはなぜでしょう?
ARMv5TのTの部分は「バリアント」と呼ばれ、TバリアントであればTHUMB命令セットに対応したARMアーキテクチャである、ことを示します。他にもエンハンストDSP命令のEとか、Jazzele命令のJがあります。
ARMv5まではTHUMB命令セットへの対応はオプションでした。このため、ARMv5世代のARMアーキテクチャはTHUMB非対応のARMv5とTHUMB対応のARMv5Tの2種類が存在し得ました。実際にTHUMB未対応のARMv5プロセッサを作った会社があるか、まではわかりませんが。そういうプロセッサを「作っても良い」ことにはなっていました。
例えば、携帯でよく使われていたARM926EJ-SプロセッサのアーキテクチャはARMv5TEJ、つまりTHUMBとエンハンストDSPとJazzeleに対応したアーキテクチャ、という意味です。
しかしARMv6からはTHUMB対応が必須となり、THUMBの有り/無しを区別する必要がなくなり、名前もARMv6のみとなりました。ARMv6はTHUMB命令セットに対応していてもARMv6Tとは呼びません。対応している機能を全部並べ始めると、冗長になるためでしょう、たぶん。
なお、エンハンストDSP命令もv6でARM命令セットに取り込まれたため、Tと同時にEバリアントも消滅しています。
さらに、最近のARMv7アーキテクチャでは、バリアントの考えが変わったようで、ARMv7の後ろに対応機能を意味するアルファベットは付かなくなりました。
種類もARMv7-AとARMv7-RとARMv7-Mの3つです。それぞれ「アプリケーション」「リアルタイム」「マイクロコントローラ」プロファイルの意味だそうです。対応する機能は下記の通り。
アーキテクチャが対応する命令セットの規模順に並べたとき、ARMとなるところもまたニクいですね。イギリス人はこういうシャレが好きなのでしょうか?
これ以上の詳細情報はARMのサイト(ARMのサイトへのリンクを張っておきます)をご覧ください。
余談ですが、ARM命令セットやTHUMB命令セットにもバージョンがあります。下記の通りです。
バージョンは1:1に対応しており、異なる世代を組み合わせること、たとえばARMv6とTHUMBv2を組み合わせることはできません。
メモ: 技術系?の話はFacebookから転記しておくことにした。なおARMv7の節は8/25に加筆。
一昨年買った(2012年4月5日の日記参照)、Logicool Perfomance MX M950が壊れました。マウスの左ボタンがバカになって、全部ダブルクリックになってしまう、良くある壊れ方です。
形あるもの、いつか壊れるとは思っていますが、1万以上したマウスが2年で壊れるのはちょっと悲しい。
存外に早く壊れた以外、使い勝手は最高に気に入っていたので、もう一個M950を買いました。アマゾンで8,226円でした。前回は12,000円したので、3割近く安くなっていますね。
しかし2年前のフラッグシップモデルだったM950が、未だにフラッグシップモデルとして君臨しているのはちょっと意外でした。余程の人気なのか、それとも新製品開発をあまりしていないのでしょうか。
Logicoolマウス愛好者としては、後者でないことを祈るばかりです。
新たにやってきたM950の保証書を見てびっくり。保証期間「ご購入日から3年間」の文字が輝いています。
さ、3年…だと…?ということは、壊れたマウスは保証期間内?無料で直せちゃう感じ?マジで…?
普通のメーカー保証は1年で速攻切れる役立たずなイメージですが、3年ってすごいですね。さすがだなLogicoolさん。でも、もう保証書がどっか行ってしまったから、何年でも意味なかったりするのだけど…。今度は大事に取っておきます。
CentOS7 EXT4 vs XFS vs Btrfs vs ZFS on vda - Qiita を読んで。
参考になります(※1)。ZFSはFUSE経由じゃないNative実装があるのか…知らなんだ。
(※1)補足。この手のベンチマークはたくさんあるように見えて、ファイルシステム側の進化が早いため、すぐに陳腐化します。なので、新しいベンチマークは常にありがたいものです。
XFSは1MB overのデカいファイルは速いけど、1KBくらいの細かいファイルのcreate/deleteをぶちかます(カーネルのtarballを展開しながら、古いカーネルソースをrm -rするとか)と、すっごい遅くて嫌になって使うの辞めた記憶があるのだけど…改善されたのだろうか?
メモ: 技術系?の話はFacebookから転記(※2)しておくことにした。
(※2)本来8月14日のエントリです。8月14日辺りでエミュレータが動いたのが嬉しくて、浮かれてFacebookに書きまくったら、このサイトに転記しきれなくなったため、未来のエントリに移動させています。
目次: C言語とlibc
switch文を使ってはいけないを読んで。
PHPはさておいて。私もswitchよりStateパターンを選びますが、C言語の関数ポインタでStateパターンを実現するのは、今も迷います。言語仕様上、悪い方に倒れるのを阻止できないためです。
ハッカーが明確で読みやすいコードを書いてくれるうちは良いですが、頭のおかしい人がdoという関数ポインタに全関数を入れるクソコードを書き始めたらもう全部パアです。
いやまさかそんなこと、と思うかもしれませんが、どこの会社とは言いませんがそんなクソコードが実在してるんですよ、世の中って怖いですよね…。
この記事(コードのネストを深くするな)を読んでいたら、会社のクソコード山脈を思い出しました。
7段ifなんて序の口。世の中の悪手とされる書き方は、大概やってるワルい奴です。バグも多い…。
メモ: 技術系?の話はFacebookから転記(※)しておくことにした。
(※)本来8月14日のエントリです。8月14日辺りでエミュレータが動いたのが嬉しくて、浮かれてFacebookに書きまくったら、このサイトに転記しきれなくなったため、未来のエントリに移動させています。
【レビュー】超小型PC「Raspberry Pi」で夏休み自由課題・第1回 - Raspberry Piとは? 入手とセットアップ (1) Raspberry Piでコンピューターを学ぼう を読んで。
"Raspberry Piは少々とっつきにくい。買ってくると基板が入っているだけで、電源をつないでも動かないのだ。"(引用)
え!そうなの?
SDカードにtarball一個解凍するだけで使えるようになるので、一番とっつきやすい部類だと思ってました。
いつの間にか一般的な理解と乖離していたみたいです。うーん、認識を改めなければいかんなー…。
メモ: 技術系?の話はFacebookから転記(※)しておくことにした。
(※)本来8月13日のエントリです。8月14日辺りでエミュレータが動いたのが嬉しくて、浮かれてFacebookに書きまくったら、このサイトに転記しきれなくなったため、未来のエントリに移動させています。
< | 2014 | > | ||||
<< | < | 08 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | - | - | - | - | - | - |
合計:
本日: