DLR言語によるSilverlightプログラミング

Silverlightを囲む会in名古屋#3での発表資料を公開しました。

Silverlight 4とGestalt(IronPython 2.6)とFlash Player 10.1のベンチマーク比較

スライド中でも紹介してますが、Silverlight4とGestalt(IronPython)とFlash Player 10.1のベンチマークを取って比較してみました。

ベンチマーク内容

以下のような内容を実施しました。

  • ランタイム自体の速度差
    • フィボナッチ数(再帰)
    • フィボナッチ数(ループ)
  • レンダリングパフォーマンスの差
    • 四角形を繰り返し表示
    • 文字列を繰り返し表示
    • 両方

SilverlightC#)用のベンチマークコードの抜粋

// フィボナッチ数(再帰)
private long Fib(int n)
{
    if (n <= 2) return 1;
    return Fib(n - 1) + Fib(n - 2);
}

// フィボナッチ数(ループ)
private long Fib2(int n)
{
    if (n <= 2) return 1;
    var list = new List<long>() { 1, 1 };
    for (var i = 2; i < n; i++)
    {
        list.Add(list[i - 2] + list[i - 1]);
    }
    return list[list.Count - 1];
}

// 四角形の描画
var rect = new Rectangle();
rect.Fill = new SolidColorBrush(Colors.Red);
rect.Width = 10;
rect.Height = 10;
Canvas.SetLeft(rect, i);
Canvas.SetTop(rect, i);
LayoutRoot.Children.Add(rect);

// 文字列の描画    
var text = new TextBlock();
text.Text = "hello world";
Canvas.SetLeft(text, i);
Canvas.SetTop(text, i);
LayoutRoot.Children.Add(text);

Gestalt(IronPython2.6)用のベンチマークコードの抜粋

# フィボナッチ数(再帰)
def fib(n):
  if n <= 2: return 1
  return fib(n-1) + fib(n-2);

# フィボナッチ数(ループ)
def fib2(n):
  if n <= 2: return 1
  list = [1, 1]
  for i in range(2, n):
    list.append(list[i-2] + list[i-1])
  return list[len(list)-1]

# 四角形の描画
rect = Rectangle()
rect.Fill = SolidColorBrush(Colors.Red)
rect.Width = 10
rect.Height = 10
Canvas.SetLeft(rect, i)
Canvas.SetTop(rect, i)
me.Children.Add(rect)

# 文字列の描画
text = TextBlock()
text.Text = 'hello world'
Canvas.SetLeft(text, i)
Canvas.SetTop(text, i)
me.Children.Add(text)

Flash Player 10.1用のベンチマークコードの抜粋

// フィボナッチ数(再帰)
function fib(n:int):int {
    if (n <= 2) return 1;
    return fib(n-1) + fib(n-2);
}
    
// フィボナッチ数(ループ)
function fib2(n:int):int {
    if (n <= 2) return 1;
    var list:Array = [1, 1];
    for (var i:int = 2; i < n; i++) {
        list[i] = list[i-2] + list[i-1];
    }
    return list[list.length - 1];
}

// 四角形の描画
canvas.graphics.beginFill(0xff0000);
canvas.graphics.drawRect(i, i, 10, 10);
canvas.graphics.endFill();

// 文字列の描画    
var label:Label = new Label();
label.text = "hello world";
label.x = i;
label.y = i;
label.width = 100;
label.height = 20 ;
canvas.addChild(label);
ベンチマーク実施環境

VAIO type Z(2世代前のモデル)

ベンチマーク結果

f:id:terurou:20100620211448p:image

  • 表中の単位はミリ秒
  • *1:実際には10秒程度描画されず
  • *2:実際には2分以上描画されず

Macで同様のベンチマークを取ると違う結果になるかもしれませんが、私はMac持ってないのでテストしようがありません。