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

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

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

新しい記事を投稿しました。シェアして読者に伝えましょう

×

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

2014-06-04 06:00
  • 1

電子書籍の機能を使用するには、記事を購入してください

※この物語はフィクションです。実在する人物・OS・プログラミング言語・企業・団体名等とは一切関係がありませんのでご注意下さい

■登場人物紹介

cf32f2ed182c931c983a8716c7a6ab4e8e4da7cdケイス淀橋
コンピュータウィルスに感染し、ネットのアチラ側からこちら側にでられなくなってしまった電脳空間カウボーイ

debf7fb808c733e9f4c07b4305b6b3cc5e691522
シン石丸
電脳空間カウボーイズのリーダー。ケイスともケイスの兄とも昵懇の仲

f9c4486465c553cfd6b37807d564ce276519dd6c
エヌ教授
実際には何を研究しているのかよくわからないがコンピュータに詳しい教授


■結局、Swiftって速いの?速くないの?

cf32f2ed182c931c983a8716c7a6ab4e8e4da7cd昨日の話なんだけど、なーーーんか釈然としないんだよねー
debf7fb808c733e9f4c07b4305b6b3cc5e691522Swiftの話?しかしあれはまあ誰かがベンチマークとるしか仕方ないんじゃないの?
cf32f2ed182c931c983a8716c7a6ab4e8e4da7cdうーん、やっぱり自分でとるべきかなあ。ぅーん
554b7c4b729e664ac9659c33058f956f0e0b7406え、まだやってないんですか?
6f6cf68eeae14831db833f4b82af268828732711え、教授・・・もうやったんですか?
f9c4486465c553cfd6b37807d564ce276519dd6cやれやれ。ケイス君も所詮は口ばっかりで手を動かさない陸ハッカーですか?当然やりましたよ
cf32f2ed182c931c983a8716c7a6ab4e8e4da7cdいや、僕だってねえ・・・うーん、まあベンチマークもとらずに悶々していました。
4f8c2cd4af13ad0668e9c1a845cb45fffb6b405aさすが教授!  そ、それで・・・!?
f9c4486465c553cfd6b37807d564ce276519dd6cとても興味深い結果が出ましたよ

■Swift vs Objective-C vs C言語
6f6cf68eeae14831db833f4b82af268828732711そ、それで・・・結局どうなってんですか
f9c4486465c553cfd6b37807d564ce276519dd6cとりあえず、まずは関数呼出しがクサいと見て関数呼出しのベンチマークを取ってみたんですね
4f8c2cd4af13ad0668e9c1a845cb45fffb6b405aまあ今回のSwiftで大きな変化がありそうなのはそのへんですよね
f9c4486465c553cfd6b37807d564ce276519dd6cまずは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");

}



4f8c2cd4af13ad0668e9c1a845cb45fffb6b405aええと、再帰的に10万回自分自身を呼ぶ関数hogeを10000回呼んでるわけですね
cf32f2ed182c931c983a8716c7a6ab4e8e4da7cdなぜ100回のループを二重にしているので?10000を一回でもよくないですか?

b964a7c2f59e75993f1515fd692606927fa6f2bbうるせえ!黙れ陸ハッカー風情が!!!!
6f6cf68eeae14831db833f4b82af268828732711ひぃぃ。ごめんなさい。
f9c4486465c553cfd6b37807d564ce276519dd6cまあいろいろと大人の事情があったのだよ。とにかく、これをベンチマークにしてみた。
4f8c2cd4af13ad0668e9c1a845cb45fffb6b405aほうほう・・・


■意外と速いObjective-C
f9c4486465c553cfd6b37807d564ce276519dd6cその結果、この処理に3〜4秒かかることが解った。1.8GHzのIntel Corei5のMacBookAir 8GB RAMの結果だ。
cf32f2ed182c931c983a8716c7a6ab4e8e4da7cd3〜4秒?ベンチマークにしてはずいぶん曖昧ですね
b964a7c2f59e75993f1515fd692606927fa6f2bbうるせえ!だったら自分で測れや!!!!
6f6cf68eeae14831db833f4b82af268828732711ひぃぃ。すみません。
4f8c2cd4af13ad0668e9c1a845cb45fffb6b405aそれで教授、Swiftはどうだったんですか?
f9c4486465c553cfd6b37807d564ce276519dd6cうーん、実はSwiftでのベンチマーク結果を公表してもいいのかよくわからないんだけど
debf7fb808c733e9f4c07b4305b6b3cc5e691522ああ、NDAですか・・・
554b7c4b729e664ac9659c33058f956f0e0b7406なんか昼寝していたら夢で見たんだよね。Swiftでの実行結果を。夢かもしれないなあ
cf32f2ed182c931c983a8716c7a6ab4e8e4da7cdまぁ夢でもなんでもいいですから教えて下さいよ。
b4e6e0ac60e379a153ca38f15ff07ee000ee2022しかたないねえ・・・まず、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")


4f8c2cd4af13ad0668e9c1a845cb45fffb6b405aおお、Swiftっぽいコードになってる!
f9c4486465c553cfd6b37807d564ce276519dd6cまあ若干の不自然さは残っているがとりあえずこれで試すとだね・・・まあ夢で見たんだけど
cf32f2ed182c931c983a8716c7a6ab4e8e4da7cdどのくらいかかったんですか?
4f8c2cd4af13ad0668e9c1a845cb45fffb6b405a知りたい知りたい
b4e6e0ac60e379a153ca38f15ff07ee000ee202239秒
9b7da2db20a31a4eaf52a2a0e84ffa66db1454142757f3adc2db200c053f1dc00a60816282344676ええっ!? C言語の10倍遅いじゃないですか!?
554b7c4b729e664ac9659c33058f956f0e0b7406だから、メーカーの言うことを鵜呑みにしちゃだめだって言ったでしょ?


■Swiftのコードをもっと高速化する
6f6cf68eeae14831db833f4b82af268828732711マジかよ。Swift、期待していたのに・・・そんなダメな子だったとは・・・
f9c4486465c553cfd6b37807d564ce276519dd6cところがここからが面白いんだなぁ。これを見た伏見遼平くんがコードを少し書き換えたんだよね
debf7fb808c733e9f4c07b4305b6b3cc5e691522伏見君が?どんなふうにですか?
f9c4486465c553cfd6b37807d564ce276519dd6cこんな感じだよ

ba9c185b4fc6c8fc726104e24ba08917ea91e574

9b7da2db20a31a4eaf52a2a0e84ffa66db1454142757f3adc2db200c053f1dc00a60816282344676ええっ!? 一気に8倍くらい高速化してませんか!!???
f9c4486465c553cfd6b37807d564ce276519dd6c
どうやらSwiftだとグローバル変数へのアクセスが遅いらしいね。
ローカル変数でやれば、C言語に迫るスピードだよ。Cだとグローバル変数でも速いのにね

debf7fb808c733e9f4c07b4305b6b3cc5e691522これ最適化にコツとか要りそうですね
f9c4486465c553cfd6b37807d564ce276519dd6cちなみに私の手元のPCでは8秒くらいだった。まあC言語の1.5倍程度遅いということかな。

■C言語よりは遅いSwift、Objective-Cとの比較は?
6f6cf68eeae14831db833f4b82af268828732711けっこうやるじゃないですか!Swift!
f9c4486465c553cfd6b37807d564ce276519dd6cそうだね。けっこうやるね・・・
debf7fb808c733e9f4c07b4305b6b3cc5e691522まあでもC言語より遅いですね。
b4e6e0ac60e379a153ca38f15ff07ee000ee2022やはりC言語が最強の言語なのだよ。フフフ・・・
cf32f2ed182c931c983a8716c7a6ab4e8e4da7cdSwiftがちょっとしたことでかなり高速化されるのはわかりましたが・・・
4f8c2cd4af13ad0668e9c1a845cb45fffb6b405aそうそう。Objective-Cより二倍速いって話はどうなってるんですか?
f9c4486465c553cfd6b37807d564ce276519dd6cあ、それ聞いちゃう?
6f6cf68eeae14831db833f4b82af268828732711まあ、そりゃもう・・・一番気になりますね。
f9c4486465c553cfd6b37807d564ce276519dd6cとりあえず、Objective-CってC言語のコードをそのまま実行できちゃうんだよね。
4f8c2cd4af13ad0668e9c1a845cb45fffb6b405a試してみたんですよね?
f9c4486465c553cfd6b37807d564ce276519dd6cうん。そしたら・・・さ、なんと4秒だったのよ。
6f6cf68eeae14831db833f4b82af268828732711え・・・それってSwiftより速くないっすか?
554b7c4b729e664ac9659c33058f956f0e0b7406そーなんだよねー


■SwiftがObjective-Cより速いって結局どういうこと?
9b7da2db20a31a4eaf52a2a0e84ffa66db145414ちょっと待って下さいよ。Swiftは少なくともObjective-Cより高速なんじゃないんですか?
f9c4486465c553cfd6b37807d564ce276519dd6cさあねー。なんかの間違いじゃない?
4f8c2cd4af13ad0668e9c1a845cb45fffb6b405aいやー、しかしさすがにAppleも全く根拠なしにあんなこと言わないでしょう
f9c4486465c553cfd6b37807d564ce276519dd6cやっぱそう思う?
cf32f2ed182c931c983a8716c7a6ab4e8e4da7cd教授、本当は何か掴んでるんでしょ?教えて下さいよ
b4e6e0ac60e379a153ca38f15ff07ee000ee2022フフフ。実はさっきのベンチマークはObjective-Cでありながら、実はタダのCなのだよ!
9b7da2db20a31a4eaf52a2a0e84ffa66db1454142757f3adc2db200c053f1dc00a60816282344676なっ!?なんだってーーーーー!!!!!?????
f9c4486465c553cfd6b37807d564ce276519dd6cObjective-Cも、C++も、C言語をオブジェクト指向風に拡張したもの、なのは知ってるよね?
cf32f2ed182c931c983a8716c7a6ab4e8e4da7cdま、まあなんとなく・・・
f9c4486465c553cfd6b37807d564ce276519dd6cつまりObjective-Cも、C++も、C言語のソースをそのままコンパイルして動かせるんだ
4f8c2cd4af13ad0668e9c1a845cb45fffb6b405aえ、じゃあObjective-CのソースでもCがそのまま動くんですか?
f9c4486465c553cfd6b37807d564ce276519dd6c左様。だからベンチマークが同じ結果になるのは不思議はないんだ。
cf32f2ed182c931c983a8716c7a6ab4e8e4da7cdじゃあ意味がないじゃないですか
b4e6e0ac60e379a153ca38f15ff07ee000ee2022でもね、実は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;

}

※このプログラムは添田 慎一さんの提供によるものです

6f6cf68eeae14831db833f4b82af268828732711え・・・これ、C言語とは全く別じゃないですか!?
debf7fb808c733e9f4c07b4305b6b3cc5e691522あー、NSObjectあったねー。こりゃたしかにiOSとかで良く見るコードだわ
f9c4486465c553cfd6b37807d564ce276519dd6cObjective-C固有の機能、メッセージパッシングを使ったコードだね
4f8c2cd4af13ad0668e9c1a845cb45fffb6b405aそれってCocoaフレームワークとか使う時には必須の機能じゃないですか
f9c4486465c553cfd6b37807d564ce276519dd6cその通り。敢えてこれを使ったコードに書き換えると、実行時間は・・・
6f6cf68eeae14831db833f4b82af2688287327114f8c2cd4af13ad0668e9c1a845cb45fffb6b405a(・・・・ごくり・・・・)
 
この記事は有料です。記事を購読すると、続きをお読みいただけます。
ニコニコポイントで購入

続きを読みたい方は、ニコニコポイントで記事を購入できます。

入会して購読

この記事は過去記事の為、今入会しても読めません。ニコニコポイントでご購入下さい。

×
プログラマではないけど、やっぱ電脳空間カウボーイズ面白い。
27ヶ月前
コメントを書く
コメントをするには、
ログインして下さい。