[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス

23

Transcript of [2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス

C#の生産性とパフォーマンス

田中達彦Visual Basic/Visual C++/C# プロダクトマネジャーデベロッパー製品部Microsoft Co.,Ltd.

アジェンダ

C#の生産性

C#のパフォーマンス

C#の言語仕様

コンポーネント指向言語

まとめ

C#とは

C# is the first language to introduce

component-oriented properties and

methods and events.

Anders Hejlsberg

C#の生産性

Visual C++ vs Visual C# の場合

同様のアプリケーションを作成した場合、Visual C#のほうが生産性が高い

Visual C#はRAD

必要なコンポーネントをドラッグ&ドロップ

ダブルクリックでイベントハンドラを作成

プロパティウィンドウでプロパティを変更

C#の生産性

デモ解説(C#の生産性)

Visual C++と比較し、C#は直感的

クラスライブラリの設計の違い

プロパティの変更が容易

ビルドにかかる時間も短い

ヘッダーファイルを使用しない

デモ解説(C#の生産性)

Visual C++のコード

Visual C#のコード

void CProject8Dlg::OnClickedButton1(void){

// TODO : ここにコントロール通知ハンドラ コードを追加します。CEdit *ed = (CEdit*)GetDlgItem(IDC_EDIT1);CStatic *st = (CStatic*)GetDlgItem(IDC_STATIC1);CString str;

ed->GetWindowText(str);st->SetWindowText(str);

}

protected void button1_Click (object sender, System.EventArgs e){

label1.Text = textBox1.Text;}

C#のパフォーマンス

「中間言語」の誤解

C#はインタープリタではない

最終的にはネイティブコードにコンパイル

熟練者の書くコード

オプティマイズにより、中級者の書くアセンブラのコードより速い

JITにより、CPUに特化したネイティブコードにコンパイル

C#のパフォーマンス

デモ解説(C#のパフォーマンス)

最適化を行わない場合Visual C++のほうが遅い場合がある

最適化を行ったコードはVisual C++とVisual C#でほぼ同じ

デモ解説(C#のパフォーマンス)

Visual C++の場合int i1 = 0;

for(int i2 = 0; i2 < 255; i2++){

i1 += i2;}

int i1 = 0;mov dword ptr [i1],0

for(int i2 = 0; i2 < 255; i2++)mov dword ptr [i2],0 jmp L2 :L1mov eax,dword ptr [i2] add eax,1 mov dword ptr [i2],eax :L2cmp dword ptr [i2],0FFh jge L3

{i1 += i2;mov eax,dword ptr [i1] add eax,dword ptr [i2] mov dword ptr [i1],eax

}jmp L1 :L3

int i1 = 0;xor ecx,ecx

for(int i2 = 0; i2 < 255; i2++)xor eax,eax

{i1 += i2;:L1add ecx,eax inc eax cmp eax,0FFh jl L1

}

最適化なし

最適化あり

デモ解説(C#のパフォーマンス)

Visual C#の場合int i1 = 0;

for(int i2 = 0; i2 < 255; i2++){

i1 += i2;}

// Code size 23 (0x17).maxstack 2.locals ([0] int32 i1,

[1] int32 i2)IL_0000: ldc.i4.0IL_0001: stloc.0IL_0002: ldc.i4.0IL_0003: stloc.1IL_0004: br.s IL_000eIL_0006: ldloc.0IL_0007: ldloc.1IL_0008: addIL_0009: stloc.0IL_000a: ldloc.1IL_000b: ldc.i4.1IL_000c: addIL_000d: stloc.1IL_000e: ldloc.1IL_000f: ldc.i4 0xffIL_0014: blt.s IL_0006IL_0016: ret

int i1 = 0;xor ebx,ebx

for(int i2 = 0; i2 < 255; i2++)xor edi,edi jmp L2

i1 += i2;:L1add ebx,edi

for(int i2 = 0; i2 < 255; i2++)inc edi :L2cmp edi,0FFh jl L1

}

ILへコンパイル

ネイティブコードにコンパイル

C#の設計思想

C/C++ファミリー言語の中で最初のコンポーネント指向言語

イベント、メソッド、プロパティ

設計時、実行時の属性

XMLを使用したドキュメントの融合

ヘッダーファイル、IDLが不要

C/C++開発者のためのRAD言語と環境

C#の設計思想

全てのものはオブジェクトである

次世代の堅牢かつ耐久性のあるソフトウェアを構築できる

ガベージ コレクション

例外処理

タイプセーフ

バージョン管理

コンポーネント指向言語

プロパティの実装

public string labelText

{

get

{

return label1.Text;

}

set

{

label1.Text = value;

}

}control1.labelText = "Hello!";

コンポーネント指向言語

メソッドの実装

public void changeText (string str)

{

label1.Text = str;

}

control1.changeText("Hello!");

コンポーネント指向言語

イベントの実装

イベントシグネチャの定義public delegate void EventHandler

(object sender, EventArgs e);

イベントと発生ロジックの定義

public event EventHandler LabelMouseEnter;

protected void OnLabelMouseEnter

(object sender, EventArgs e){if(LabelMouseEnter != null)LabelMouseEnter(this, e)

}

コンポーネント指向言語

イベントハンドラの定義と登録

control1.LabelMouseEnter += new

EventHandler(this.control1_LabelMouseEnter)

protected void control1_LabelMouseEnter

(object sender, EventArgs e)

{

control1.labelText = "マウス通過";

}

コンポーネントの作成

コンポーネント指向言語

全てのものをコンポーネントとして扱えるため、再利用性が高い

クライアントサイドコンポーネント、サーバーサイドコンポーネントの両方で使用可能

Windowsコントロールライブラリ

クラスライブラリ

Webサービス

まとめ

C#は生産性、パフォーマンスとも優れている

言語自身がコンポーネント指向言語なので、再利用性が高い

C#を使わない理由がありますか?