2011-01-04 13 views
1

とにかく、次の解決の速いXAMLでの色のスピードテストにあります:速度(シルバー)

Named Color: Orange 
Hex: #ff6600 
Shorthand Hex: #f60 
Known Color: DarkOrange

は、これは単なる好奇心や学術的な運動ではありません。私は大量に色を何度も変えるアニメーションと色のトンとトンを大規模に持っています。私は今まで何度も時間を節約する必要があります。

上記をSilverlightでテストする方法を探しています。何か案は?

+0

ベンチマークを試しましたか? –

+0

@ミッチ・コムト:どうしたらいいですか?私は以前にそれをしていない。 – Stan

答えて

3

私はこれをテストする決定的な方法は考えられませんでしたが、私はあなたにヒントを与えるかもしれない何かをまとめました。効果的に、私は矩形の色を変更するたびにPropertyChangedイベントを発生させたクラスの(文字列)SelectedColorプロパティにバインドしました。次に、説明したさまざまな方法で色を定義した4つの異なるListコレクションを作成しました。バックグラウンドスレッドでは、UIスレッドに戻るように各ループにSelectedColorプロパティを設定して10000回繰り返しました。複雑な部分は、すべてのスレッドを適切に同期させておくことでした。そこには、前のタスクが終了したことがわかるまで、20 msごとにループする少なくとも1つのハックがあります。しかし、少なくとも、UIスレッドは色の文字列を解析しなければなりません。

とにかく、このテスト方法が有効である限り、表記法は他の表記法よりも多少速いかもしれませんが、多くはそうではありません。 10のテスト実行後の私のマシン上での平均結果:

六角:名前付き4596ミリ秒
:4609ミリ秒
短縮形六角:5018ミリ秒
既知の色:ちょうど参照用の5065ミリ

、ここでは、コードビハインドです:

public partial class MainPage : UserControl, INotifyPropertyChanged 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     namedColors.Add("Black"); 
     namedColors.Add("Black"); 
     namedColors.Add("Brown"); 
     namedColors.Add("Cyan"); 
     namedColors.Add("DarkGray"); 
     namedColors.Add("Gray"); 
     namedColors.Add("Green"); 
     namedColors.Add("LightGray"); 
     namedColors.Add("Magenta"); 
     namedColors.Add("Orange"); 

     hexColors.Add(Colors.Black.ToString()); 
     hexColors.Add(Colors.Black.ToString()); 
     hexColors.Add(Colors.Brown.ToString()); 
     hexColors.Add(Colors.Cyan.ToString()); 
     hexColors.Add(Colors.DarkGray.ToString()); 
     hexColors.Add(Colors.Gray.ToString()); 
     hexColors.Add(Colors.Green.ToString()); 
     hexColors.Add(Colors.LightGray.ToString()); 
     hexColors.Add(Colors.Magenta.ToString()); 
     hexColors.Add(Colors.Orange.ToString()); 

     knownColors.Add("LawnGreen"); 
     knownColors.Add("LemonChiffon"); 
     knownColors.Add("LightBlue"); 
     knownColors.Add("LightCoral"); 
     knownColors.Add("LightCyan"); 
     knownColors.Add("LightGoldenrodYellow"); 
     knownColors.Add("LightGray"); 
     knownColors.Add("LightGreen"); 
     knownColors.Add("LightPink"); 
     knownColors.Add("LightSalmon"); 

     shorthandHexColors.Add("#000"); 
     shorthandHexColors.Add("#111"); 
     shorthandHexColors.Add("#222"); 
     shorthandHexColors.Add("#333"); 
     shorthandHexColors.Add("#444"); 
     shorthandHexColors.Add("#555"); 
     shorthandHexColors.Add("#666"); 
     shorthandHexColors.Add("#777"); 
     shorthandHexColors.Add("#aaa"); 
     shorthandHexColors.Add("#bbb"); 

     LayoutRoot.DataContext = this; 
    } 

    private List<string> namedColors = new List<string>(); 
    private List<string> hexColors = new List<string>(); 
    private List<string> shorthandHexColors = new List<string>(); 
    private List<string> knownColors = new List<string>(); 

    private List<double> namedColorDurations = new List<double>(); 
    private List<double> hexColorDurations = new List<double>(); 
    private List<double> shorthandHexColorDurations = new List<double>(); 
    private List<double> knownColorDurations = new List<double>(); 

    private string selectedColor; 
    public string SelectedColor 
    { 
     get 
     { 
      return selectedColor; 
     } 
     set 
     { 
      if (selectedColor != value) 
      { 
       selectedColor = value; 
       RaisePropertyChanged("SelectedColor"); 
      } 
     } 
    } 

    private void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private bool isTesting = false; 
    private void testButton_Click(object sender, RoutedEventArgs e) 
    { 
     if (isTesting) 
     { 
      return; 
     } 
     else 
     { 
      isTesting = true; 
     } 
     ThreadPool.QueueUserWorkItem(o => 
     { 
      AutoResetEvent resetEvent = new AutoResetEvent(false); 
      for (int i = 0; i < 10; i++) 
      { 
       TestColors(resetEvent, hexColors, lstHexColorDuration, hexColorDurations); 
       resetEvent.WaitOne(); 
       TestColors(resetEvent, namedColors, lstNamedColorDuration, namedColorDurations); 
       resetEvent.WaitOne(); 
       TestColors(resetEvent, shorthandHexColors, lstShorthandHexDuration, shorthandHexColorDurations); 
       resetEvent.WaitOne(); 
       TestColors(resetEvent, knownColors, lstKnownColorDuration, knownColorDurations); 
       resetEvent.WaitOne(); 
      } 
      Dispatcher.BeginInvoke(() => 
      { 
       lstHexColorDuration.Items.Add(hexColorDurations.Average().ToString()); 
       lstNamedColorDuration.Items.Add(namedColorDurations.Average().ToString()); 
       lstShorthandHexDuration.Items.Add(shorthandHexColorDurations.Average().ToString()); 
       lstKnownColorDuration.Items.Add(knownColorDurations.Average().ToString()); 
      }); 
      isTesting = false; 
     }); 
    } 

    private int testsFinished = 0; 
    private void TestColors(AutoResetEvent resetEvent, List<string> colorList, ListBox resultListBox, List<double> results) 
    { 
     ThreadPool.QueueUserWorkItem(o => 
      { 
       var start = DateTime.Now; 
       int testPasses = 10000; 
       testsFinished = 0; 
       for (int i = 0; i < testPasses; i++) 
       { 
        foreach (string color in colorList) 
        { 
         SetColor(color); 
        } 
       } 
       while (testsFinished < testPasses * colorList.Count) 
       { 
        Thread.Sleep(20); 
       } 
       DateTime finish = DateTime.Now; 
       results.Add((finish - start).TotalMilliseconds); 
       Dispatcher.BeginInvoke(() => resultListBox.Items.Add((DateTime.Now - start).ToString())); 
       resetEvent.Set(); 
      }); 
    } 

    private void SetColor(string color) 
    { 
     Dispatcher.BeginInvoke(() => 
      { 
       SelectedColor = color; 
       Interlocked.Increment(ref testsFinished); 
      }); 
    } 
} 

そしてここでXAML適切です:

<UserControl 
x:Class="SilverlightScratch.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:local="clr-namespace:SilverlightScratch" 
mc:Ignorable="d" 
d:DesignHeight="300" d:DesignWidth="500"> 

<Grid x:Name="LayoutRoot" Background="White" > 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <Button Height="30" Width="100" x:Name="testButton" Content="Start Test" Click="testButton_Click" /> 
    <Rectangle Height="30" Width="100" Fill="{Binding SelectedColor}" Grid.Row="2" /> 
    <StackPanel Orientation="Horizontal" Grid.Row="1"> 
     <StackPanel> 
      <TextBlock Text="Named Color Duration" /> 
      <ListBox x:Name="lstNamedColorDuration" /> 
     </StackPanel> 
     <StackPanel> 
      <TextBlock Text="Hex Color Duration" /> 
      <ListBox x:Name="lstHexColorDuration" /> 
     </StackPanel> 
     <StackPanel> 
      <TextBlock Text="Shorthand Hex Duration" /> 
      <ListBox x:Name="lstShorthandHexDuration" /> 
     </StackPanel> 
     <StackPanel> 
      <TextBlock Text="Known Colors Duration" /> 
      <ListBox x:Name="lstKnownColorDuration" /> 
     </StackPanel> 
    </StackPanel> 
</Grid> 
</UserControl> 
+0

これは絶対に素晴らしいことです!私は十分にあなたに感謝することはできません、私はベンチマーク方法についてあなたのコードから多くを学んだ。私は今、賞金を授与することができればいいと思うが、システムタイマーは45分以上待たなければならないと言っている。私はそれを授与します。再びありがとう。 – Stan

+0

うれしかった!それを行う方法を理解するのは楽しいことでした。 –