• このエントリーをはてなブックマークに追加

今なら、継続入会で月額会員費が1ヶ月分無料!

記事 1件
  • 【エヌ教授の事件簿】高速プログラミング言語Swiftは本当に速いのか!?

    2014-06-04 06:00  
    509pt
    ※この物語はフィクションです。実在する人物・OS・プログラミング言語・企業・団体名等とは一切関係がありませんのでご注意下さい■登場人物紹介ケイス淀橋コンピュータウィルスに感染し、ネットのアチラ側からこちら側にでられなくなってしまった電脳空間カウボーイシン石丸電脳空間カウボーイズのリーダー。ケイスともケイスの兄とも昵懇の仲エヌ教授実際には何を研究しているのかよくわからないがコンピュータに詳しい教授■結局、Swiftって速いの?速くないの?昨日の話なんだけど、なーーーんか釈然としないんだよねー
    Swiftの話?しかしあれはまあ誰かがベンチマークとるしか仕方ないんじゃないの?うーん、やっぱり自分でとるべきかなあ。ぅーんえ、まだやってないんですか?え、教授・・・もうやったんですか?やれやれ。ケイス君も所詮は口ばっかりで手を動かさない陸ハッカーですか?当然やりましたよいや、僕だってねえ・・・うーん、まあベンチマークもとらずに悶々していました。さすが教授!  そ、それで・・・!?とても興味深い結果が出ましたよ■Swift vs Objective-C vs C言語そ、それで・・・結局どうなってんですかとりあえず、まずは関数呼出しがクサいと見て関数呼出しのベンチマークを取ってみたんですねまあ今回のSwiftで大きな変化がありそうなのはそのへんですよねまずはC言語で次のようなプログラムを書いたわけです。#include<stdio.h>
    int cnt = 100000;
    void hoge(){
     if( cnt == 0 ){
      return;
     }else{
      cnt--;
      hoge();
     }
    }
    int main(){
     printf("Start!\n");
     for (int j=0;j<100;j++){
      for(int i=0;i<100;i++){
       cnt=100000;
       hoge();
      }
     }
     printf("End\n");
    }
    ええと、再帰的に10万回自分自身を呼ぶ関数hogeを10000回呼んでるわけですねなぜ100回のループを二重にしているので?10000を一回でもよくないですか?うるせえ!黙れ陸ハッカー風情が!!!!ひぃぃ。ごめんなさい。まあいろいろと大人の事情があったのだよ。とにかく、これをベンチマークにしてみた。ほうほう・・・■意外と速いObjective-Cその結果、この処理に3〜4秒かかることが解った。1.8GHzのIntel Corei5のMacBookAir 8GB RAMの結果だ。3〜4秒?ベンチマークにしてはずいぶん曖昧ですねうるせえ!だったら自分で測れや!!!!ひぃぃ。すみません。それで教授、Swiftはどうだったんですか?うーん、実はSwiftでのベンチマーク結果を公表してもいいのかよくわからないんだけどああ、NDAですか・・・なんか昼寝していたら夢で見たんだよね。Swiftでの実行結果を。夢かもしれないなあまぁ夢でもなんでもいいですから教えて下さいよ。しかたないねえ・・・まず、Swiftでのコードはこうだよimport Foundation
    var cnt = 100000
    func hoge(){
        if( cnt == 0 ){
            return;
        }else{
            cnt--;
            hoge()
        }
    }
    println("Start!")
    var j=0
    while j<100{
        var i=0
        while i<100{
            cnt = 100000
            hoge();
            i++;
        }
        j++;
    }
    println("End")
    おお、Swiftっぽいコードになってる!まあ若干の不自然さは残っているがとりあえずこれで試すとだね・・・まあ夢で見たんだけどどのくらいかかったんですか?知りたい知りたい39秒ええっ!? C言語の10倍遅いじゃないですか!?だから、メーカーの言うことを鵜呑みにしちゃだめだって言ったでしょ?
    ■Swiftのコードをもっと高速化するマジかよ。Swift、期待していたのに・・・そんなダメな子だったとは・・・ところがここからが面白いんだなぁ。これを見た伏見遼平くんがコードを少し書き換えたんだよね伏見君が?どんなふうにですか?こんな感じだよええっ!? 一気に8倍くらい高速化してませんか!!???どうやらSwiftだとグローバル変数へのアクセスが遅いらしいね。ローカル変数でやれば、C言語に迫るスピードだよ。Cだとグローバル変数でも速いのにねこれ最適化にコツとか要りそうですねちなみに私の手元のPCでは8秒くらいだった。まあC言語の1.5倍程度遅いということかな。■C言語よりは遅いSwift、Objective-Cとの比較は?けっこうやるじゃないですか!Swift!そうだね。けっこうやるね・・・まあでもC言語より遅いですね。やはりC言語が最強の言語なのだよ。フフフ・・・Swiftがちょっとしたことでかなり高速化されるのはわかりましたが・・・そうそう。Objective-Cより二倍速いって話はどうなってるんですか?あ、それ聞いちゃう?まあ、そりゃもう・・・一番気になりますね。とりあえず、Objective-CってC言語のコードをそのまま実行できちゃうんだよね。試してみたんですよね?うん。そしたら・・・さ、なんと4秒だったのよ。え・・・それってSwiftより速くないっすか?そーなんだよねー■SwiftがObjective-Cより速いって結局どういうこと?ちょっと待って下さいよ。Swiftは少なくともObjective-Cより高速なんじゃないんですか?さあねー。なんかの間違いじゃない?いやー、しかしさすがにAppleも全く根拠なしにあんなこと言わないでしょうやっぱそう思う?教授、本当は何か掴んでるんでしょ?教えて下さいよフフフ。実はさっきのベンチマークはObjective-Cでありながら、実はタダのCなのだよ!なっ!?なんだってーーーーー!!!!!?????Objective-Cも、C++も、C言語をオブジェクト指向風に拡張したもの、なのは知ってるよね?ま、まあなんとなく・・・つまりObjective-Cも、C++も、C言語のソースをそのままコンパイルして動かせるんだえ、じゃあObjective-CのソースでもCがそのまま動くんですか?左様。だからベンチマークが同じ結果になるのは不思議はないんだ。じゃあ意味がないじゃないですかでもね、実はObjective-C"らしい"プログラムは全然別ものになるんだよ#include <Cocoa/Cocoa.h>
    @interface Hoge : NSObject
    @property (assign) NSNumber *cnt;
    -(void)hoge;
    @end
    @implementation Hoge
    @synthesize cnt;
    -(id)initWithNumber:(NSNumber *)number
    {
        self = [super init];
        if(self){
            cnt = number;
        }
        return self;
    }
    -(void)hoge
    {
        //NSLog(@"in hoge:%@", cnt);
        if( [cnt isEqualToNumber:@0] ){
            return;
        }else{
            int i_cnt = [cnt intValue];
            cnt = [NSNumber numberWithInt:i_cnt - 1];
            [self hoge];
        }
    }
    @end
    int main(int argc, const char * argv[])
    {
        @autoreleasepool{
            NSLog(@"Start\n");
            printf("Start\n");
            for( int i = 0 ; i < 100 ; i++ ){
                for( int j = 0 ; j < 100 ; j++ ){
                    Hoge *h = [[Hoge alloc] initWithNumber:@100000];
                    [h hoge];
                }
            }
        }
        return 0;
    }
    ※このプログラムは添田 慎一さんの提供によるものですえ・・・これ、C言語とは全く別じゃないですか!?あー、NSObjectあったねー。こりゃたしかにiOSとかで良く見るコードだわObjective-C固有の機能、メッセージパッシングを使ったコードだねそれってCocoaフレームワークとか使う時には必須の機能じゃないですかその通り。敢えてこれを使ったコードに書き換えると、実行時間は・・・(・・・・ごくり・・・・)