Entries from 2012-01-01 to 1 year

JavaScript(V8)で避けるべき(だった?)クロージャの使い方

Grokking V8 closures for fun (and profit?) に、ほんの少しだけ触れられている話なんですが。ごく最近まで V8 には、オブジェクトリテラルの中で関数リテラルを使った場合に非常に遅くなる(というかGCが多発する)問題があった。たとえば、 function doit()…

C++ の vtbl に、関数以外の型のデータを入れる

C++ でコードを書いていて、vtbl に関数以外のデータを入れたくなったことはありませんか? 僕はあります。型によって異なる定数を高速に知りたい(たとえばあるフィールドが何バイト目にあるか)けど、仮想関数呼出だと遅いし、かといって、インスタンス変…

C++ でコンパイル時に 2^n に切り上げる

C++ で速度を要求されるプログラムを書いていると、コンパイル時に定数を 2^n に切り上げたいことがあります。というか、必要だったので書いた。 template<size_t N> struct RoundUp { template<size_t M, size_t D> struct _Between { static const size_t MidV = 1 << (M + D / 2); stati</size_t></size_t>…

プログラム中に HTML とか埋め込むためのテンプレートエンジン picotemplate を作った件

たとえばドキュメント生成ツールなんかを作ってると、HTML をプログラムの中で生成したい!ってことは良くあると思います。でも、そのためにいちいちテンプレートエンジンを使うのは大げさな場合も多いですよね。たとえば、ちょっとリストを出力するとき。以…

JSX で Array#forEach が5倍以上速くなった話

JSX の進化速度が半端ない - ぐるぐる~ で紹介していただいているとおり、最新の JSX では function expression の型宣言を省略できるようになっています。これを利用して、たとえば配列の合計を求める場合、 var sum = 0; [ 1, 2, 3, 4, 5, 6, 7, 8 ].forE…

JSXにテンプレート型サポート入れ始めた

まだ master にはマージしてないですが kazuho/user-defined-templates ブランチのやつを使うと、 class Adder.<T> { static function f(x : T, y : T) : T { return x + y; } } class Test { static function run() : void { var n = Adder.<number>.f(1, 3); log n; v</number></t>…

haXe と JSX の最大の違いは null と undefined の扱い

JavaScript のコードをデバッグ中、突然出現する null や undefined に苦しめられている方も多いのではないでしょうか。haXe と JSX の一番大きな差は、個人的には、その null (と undefined) の扱いにあると考えています。haXe の JavaScript 実装では、全…

JSX はなぜ「速い」のか

なぜ「速い」のか、について JSX 開発者の立場から。たとえば、シューティングゲームで一番重たい処理は何か。言うまでもなく衝突判定。多数の弾や敵機の衝突判定を毎フレームごとに行う必要があり、この演算が重たい。JSX に同梱されている web/example/sho…

node.js におけるエラー処理のコーディングパターン (もしくは非同期 JavaScript における例外処理)

node.js を代表とする JavaScript を用いた非同期プログラミング環境においては、コーディングパターンのベストプラクティスが共有されておらず、結果として品質の低いコードが多くなるという問題があるように思います。そこで、特にエラー処理をどう書くべ…

勝手に添削 re Perl5 の適当な手書きパーザで、簡単な数式をパースしてみる

http://d.hatena.ne.jp/tokuhirom/20120413/1334282197 を勝手に添削。 my $src = "11*3+2/2"; use Data::Dumper; print Dumper(parse($src)); exit; sub parse { my $src = shift; my $ret = expression(\$src); if ($src) { die "Parse failed: $src"; } $…

C++ のヘッダファイルを #include するだけで使える GC 書いてみた

そういえば C++ のヘッダファイルを #include するだけで使える GC を書きました。使い方は下のサンプルコードを見てもらえばいいとして、特徴としては、 ヘッダファイルを #include するだけで使える C++ の標準機能だけを使っているのでポータブル*1 mark-…