タグ

ブックマーク / gfx.hatenadiary.org (14)

  • Android的には、LevelDBはSharedPreferencesの高速な代替として使えそう - Islands in the byte stream (legacy)

    参考: LevelDB入門 (基編) - from scratch AndroidにおけるLevelDB bindingは複数あるようだけど、今回はMaven Centralに上がっていてかつ読み書きAPIがわかりやすい以下のものを使った*1。 https://github.com/googolmo/Leveldb-Android dependencies { compile 'im.amomo.leveldb:leveldb:1.0.+@aar' } KVSなのでSharedPreferencesのように使える。速度はopen/closeにSharedPreferencesよりコストが掛かるものの、読み書きは非常に高速にできるようだ。 サンプルアプリのソースコード: https://github.com/gfx/Android-LevelDBExample 使っているところはこんな感じ

    Android的には、LevelDBはSharedPreferencesの高速な代替として使えそう - Islands in the byte stream (legacy)
  • JSにコンパイルされたDartがPerlより速い件 - Islands in the byte stream (legacy)

    Dartのインストールが簡単になっていたので試してみたところ、Perlよりも高速だった。 なにこれ悔しい。 Dart: void main() { final t = new Stopwatch(); t.start(); final a = new List<int>(); for(var i = 0; i < 1000000; ++i) { a.add(i); } for(var i = 0; i < a.length; ++i) { ++a[i]; } var sum = 0; for(var i = 0; i < a.length; ++i) { sum += a[i]; } print(sum); print(t.elapsedMilliseconds / 1000); } Perl: use 5.12.0; use Time::HiRes qw(gettimeofday tv_

    JSにコンパイルされたDartがPerlより速い件 - Islands in the byte stream (legacy)
  • Snow Leopard & Xcode 4+ & system perl でXSをビルドできない問題の修正法 - Islands in the byte stream (legacy)

    MacOSX Snow LeopardでXcode 4以上を使っているとき、system perl向けのXSモジュールがまったくビルドできないという非常に厄介な問題があります。 これは、system perlがユニバーサルバイナリでppc用のバイナリを含むようになっているにも関わらず、Xcode 4以降のgccではppc向けのクロスコンパイラが含まれていないためです。また、system perlのccが"gcc-4.2"となっていますが、Xcode 4以降だとgcc-4.2というコマンドが存在しないことも問題です。 これを解消するためにはConfig.pm/Config_heavy.plをいじって上記の問題を修正します。 以下のコマンドを実行してconfigを修正するのが簡単でしょう。 sudo perl -i -pe 's/gcc-4.2/gcc/g; s/-arch ppc//g' \

    Snow Leopard & Xcode 4+ & system perl でXSをビルドできない問題の修正法 - Islands in the byte stream (legacy)
  • quick sortよりも高速でmerge sortのように安定しているソートアルゴリズムtim sort [勘違い] - Islands in the byte stream

    <追記>ベンチマークプログラムに誤りがありました。ソート済のシーケンスに対してソートを掛けていました。ご指摘ありがとうございます>ak氏 そんな夢のようなソートアルゴリズムがあるのかというと、あるらしいんです。それがtim sortと呼ばれるアルゴリズムです。 画期的(?)なソートアルゴリズム「Sleep Sort」:濃縮還元オレンジニュース|gihyo.jp … 技術評論社 このあたりで拾ってきたネタですね。 merge sortを改良したアルゴリズムで、安定*1しており、しかも実行速度にも優れているとか。アルゴリズムの性能の評価は済んでいるらしく、CPythonやJDK7には既に導入済みのようですね。 ならば当然Perlのソートも…と考えるわけですが、まず評価のためにJavaのソースをC++にそのまま移植してみました。それがこれ(いちおうテスト済): https://github.co

    quick sortよりも高速でmerge sortのように安定しているソートアルゴリズムtim sort [勘違い] - Islands in the byte stream
    Watson
    Watson 2011/10/19
    興味深い
  • Perl 5.15.2 released! - Islands in the byte stream (legacy)

    Perlの開発版である5.15.2がリリースされました。 https://metacpan.org/release/RJBS/perl-5.15.2 このバージョンで組み込み関数のサブルーチンリファレンスが取れるようになっています。 use 5.15.2; # automatically turns on strict my $time = \&CORE::time; say $time->(); # 1313908276 また、__FILE__と__LINE__がtime()同様引数をとらない組み込み関数として解釈されるようになったので、以下のようなことも可能です。 use 5.15.2; # automatically turns on strict my $file= \&CORE::__FILE__; say $file->(); # foo.pl ただし組み込み関数のリファレンス

    Perl 5.15.2 released! - Islands in the byte stream (legacy)
    Watson
    Watson 2011/08/21
  • Perlのメモリリークを見つける方法 - Islands in the byte stream (legacy)

    Perlではメモリリーク検出ツールがいくつか開発されているので、top(1)の結果を眺めるよりそういうツールを使うほうが楽である。 さて、メモリリークが発生しているとき、その可能性としてはだいたい以下の4つが挙げられる。 Perlレベルでの循環参照 グローバル変数に値をどんどん足しているとき*1 XSレベルでリファレンスカウントの管理ミス XSレベルでmalloc()したメモリの管理ミス この1-3についてはすべてPerlインタプリタ内の出来事であり、Test::LeakTraceを使って検出できる。4を検出するのは難しいが、Test::Valgrindが役に立つ。 Test::LeakTraceのSYNOPSISは歴史的経緯によりごちゃごちゃしているが、テストで使うべき関数はno_leaks_ok()とleaks_cmp_ok()だけである。 たとえば、以下のようにして使う*2。 #!p

    Perlのメモリリークを見つける方法 - Islands in the byte stream (legacy)
    Watson
    Watson 2011/06/20
  • 常識を覆すソートアルゴリズム!その名も"sleep sort"! - Islands in the byte stream (legacy)

    TwitterのTLで知ったのだが、少し前に海外掲示板で"sleep sort"というソートアルゴリズムが発明され、公開されたようだ。このアルゴリズムが面白かったので紹介してみる。 Genius sorting algorithm: Sleep sort 1 Name: Anonymous : 2011-01-20 12:22 諸君!オレは天才かもしれない。このソートアルゴリズムをみてくれ。こいつをどう思う? #!/bin/bash function f() { sleep "$1" echo "$1" } while [ -n "$1" ] do f "$1" & shift done wait example usage: ./sleepsort.bash 5 3 6 3 6 3 1 4 7 2 Name: Anonymous : 2011-01-20 12:27 >>1 なん…だと

    常識を覆すソートアルゴリズム!その名も"sleep sort"! - Islands in the byte stream (legacy)
  • The three significant features in Perl 5.14 - Islands in the byte stream (legacy)

    perl 5.14.0がリリースされた。Ubuntuなどでは、perlbrew経由でインストールするといくつかテストが失敗するようなので--forceオプションを使わないとインストールできない。 # 念のため-DDEUGGINGもつける。threadは好みで。 $ perlbrew --force install perl-5.14.0 -DDEBUGGING -Duseithreads Task::Plackなどの主要モジュール群ではCoro以外はいまのところ問題なくインストールできている。 さて、このバージョンは数多くの機能がが追加されているが、特に重要な機能が三つある。このエントリではその機能を紹介する。 The package block syntax package宣言が他の言語のクラス宣言に近い形で書けるよう拡張された。特に、以下のような小さなクラスが分かりやすくに書けるように

    The three significant features in Perl 5.14 - Islands in the byte stream (legacy)
    Watson
    Watson 2011/05/15
  • Re: Perlスクリプトの一行目には何と書くべきなのか - Islands in the byte stream (legacy)

    Re: Perlスクリプトの一行目には何と書くべきなのか もしCPAN形式でスクリプトを配布するなら、それは#!/usr/bin/perlないし#!perlとするべきで、env(1)を使うべきではないと思います。 CPAN形式のディストリビューションでは、インストールするスクリプトのshebang行をインストール直前に修正し、正しいパスに書き換えてくれます。ただし、このルーチン*1はいまのところenv(1)を認識してくれません。つまり、env(1)を使った場合、インストールに使用したperlと実際に実行されるperlが一致するとは限りません。perlを一つしかインストールしていないシステムなら、これでも問題なく動きます。しかし最近では、システムにインストールしてあるperlには触らず、アプリケーション用のperlを別途perlbrewなどでインストールしてそちらを使うということもよく行われ

    Re: Perlスクリプトの一行目には何と書くべきなのか - Islands in the byte stream (legacy)
    Watson
    Watson 2010/09/14
  • XSでメモリークを避けるたった一つの方法 - Islands in the byte stream (legacy)

    XSでメモリリークを避ける基原則は、それほど難しくない。すなわち、作ったSV(およびSVファミリ)はすぐsv_2mortal()するのである。mortalなSVはスコープ*1から抜けるときに解放されるため、メモリリークは起こらない。つまり、あるスコープ内で新しく作ったすべてのSVをmortalな状態にしておくということだ。 この原則のもとでコードを書くと、誤ってリファレンスカウントを増やさなかったケースでは警告が頻繁に起きる。しかし、少なくともメモリリークは起こらない*2。メモリリークの検出は難しいので、警告が出るのは福音であろう。 もちろんこれは原則で、メモリリークにまつわることで覚えなければならないことは決して少なくない。 たとえば、XSUBの戻り値をSV*にするとき、sv_2mortal(RETVAL)してはいけない。これはPerlの仕様ではなくxsubppが勝手にsv_2mort

    XSでメモリークを避けるたった一つの方法 - Islands in the byte stream (legacy)
    Watson
    Watson 2010/05/20
  • XS基礎文法最速マスター - Islands in the byte stream (legacy)

    元ネタ:Perl基礎文法最速マスター(id:perlcodesample) XSを始めるための手順といくつかの要素の解説です。C言語をある程度知っている人でも,これを読んだだけでXSの基礎をマスターしてXSを書くことができるようにはなっていません。リファレンスでもありません。 XSとは,狭義ではPerlでエクステンションを書くためのマクロ言語の名前ですが,広義ではエクステンションを書くための技術の総称です。ここでは,広義のXSを俯瞰します。 XSはいろいろと特殊なのでテンプレは無視で行きます。 目次: h2xsで空のディストリビューションを作る XSファイルの構成 スレッドコンテキスト SVファミリ GCとスコープ さらなる学習のために h2xsで空のディストリビューションを作る 以下のコマンドで空のXSディストリビューションを作ることができます。 h2xs -A -b 5.8.1 -n

    XS基礎文法最速マスター - Islands in the byte stream (legacy)
    Watson
    Watson 2010/02/02
  • Perl 5.11.2 features - Islands in the byte stream (legacy)

    Perl 5.11.1 featuresの続報。 Perl 5.11.2がリリースされた。 例によって個人的に興味をもったトピックを紹介する。 qr overloading 文字列,数値,ブール値に加え,正規表現のオーバーロードができるようになった 正規表現中に埋め込まれるときや,=~演算子の右辺として使うときに起動される Pluggable keywords Perl Perserに対して,新しいキーワードを定義するためのhookが追加された(!) この実装のため,Perl internalsに対するAPIもいくつか追加されている Pluggable keywordsが非常に興味深い。Devel::Declareがコアでサポートされたようなものだろうか。これは詳しく調べる必要があるだろう。 See also perl5112delta.

    Perl 5.11.2 features - Islands in the byte stream (legacy)
    Watson
    Watson 2009/11/21
  • モダンなXSの書き方 - Islands in the byte stream (legacy)

    PerlのソースコードはPerl言語以上に変化が大きく,それに伴ってXSの書き方もだいぶ変わってきている。新しいAPIを使ったほうが可読性がよかったり高速だったり使いやすかったりする。 たとえば,スカラー(SV)から文字列(PV: pointer valueつまりchar*)を得るAPIの変遷は次のようになっている。 /* SV*からPVを得る古い書き方 */ STRLEN len; const char* pv = SvPV(pv, len); # pvとlen両方ほしいとき const char* pv_only = SvPV(pv, PL_na); # pvだけほしいとき /* その後SvPV_nolen()が追加され,PL_naはdeprecatedに */ const char* pv_only = SvPV_nolen(pv); /* 今は*_constが追加されたのでcons

    モダンなXSの書き方 - Islands in the byte stream (legacy)
    Watson
    Watson 2008/12/18
  • Perl/XSが得意なこと - Islands in the byte stream (legacy)

    最近ひたすらXSを書いていて思ったのが,XSはやっぱり速いということ。 ただ,いつでも無条件に速いというわけでもなく,何も考えずに書くとPurePerlのコードより遅くなることも珍しくない。実際,最近書いたShikaやMOPのXS版もいきなり高速だったわけではなく,一番最初のコードはPurePerlのほうが10%-30%ほど高速だった。 いろいろベンチマークをとった結果の感触として,XSの得手・不得手が分かってきたのでメモしておく。ちなみに下記で「注意を払う」というのは内部で呼ばれるmalloc()を極力減らすという意味で使っている。SVの生成自体はmalloc()を伴わないことが多い*1が,文字列の生成/連結や配列の生成/push/unshiftでは内部でmalloc()が呼ばれる可能性が高く,速度を落とす原因となる。 得手分野 ループ - XSのループが早いというより,Perlのループ

    Perl/XSが得意なこと - Islands in the byte stream (legacy)
    Watson
    Watson 2008/12/05
  • 1