以XAML为单位的颜色分辨率速度(Silverlight)
是否有任何方法可以加速测试以下哪项在XAML中的颜色解析速度更快: Named Color: Orange Hex: #ff6600 Shorthand Hex: #f60 Known Color: DarkOrange 命名颜色:橙色 十六进制:#ff6600 速记十六进制:#f60 已知颜色:DarkOrange 这不仅仅是一种好奇心或学术活动。我有无数的动画和颜色,它们可以大规模地多次改变颜色。我需要尽可能节省一点时间以XAML为单位的颜色分辨率速度(Silverlight),silverlight,testing,colors,Silverlight,Testing,Colors,是否有任何方法可以加速测试以下哪项在XAML中的颜色解析速度更快: Named Color: Orange Hex: #ff6600 Shorthand Hex: #f60 Known Color: DarkOrange 命名颜色:橙色 十六进制:#ff6600 速记十六进制:#f60 已知颜色:DarkOrange 这不仅仅是一种好奇心或学术活动。我有无数的动画和颜色,它们可以大规模地多次改变颜色。我需要尽可能节省一点时间 正在寻找一种方法来测试上面的Silverlight。有什么想法吗?我想
正在寻找一种方法来测试上面的Silverlight。有什么想法吗?我想不出一个确定的方法来测试这个,但我把一些东西放在一起,可能会给你一个提示。实际上,我将矩形的颜色绑定到一个类的(string)SelectedColor属性,该类在每次更改时引发PropertyChanged事件。然后,我创建了四个不同的列表集合,它们以您描述的所有不同方式定义了颜色,并在一个后台线程中循环了它们大约10000次,通过分派回UI线程在每个循环上设置SelectedColor属性。复杂的部分只是保持所有线程正确地同步,至少有一个黑客在那里,我每20毫秒循环一次,直到我看到前面的任务已经完成。但它至少迫使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);
});
}
}
公共部分类主页面:UserControl,INotifyPropertyChanged
{
公共主页()
{
初始化组件();
名称颜色。添加(“黑色”);
名称颜色。添加(“黑色”);
命名颜色。添加(“棕色”);
名称颜色。添加(“青色”);
命名颜色。添加(“暗灰色”);
名称颜色。添加(“灰色”);
名称颜色。添加(“绿色”);
名称颜色。添加(“浅灰色”);
名称颜色。添加(“洋红色”);
命名颜色。添加(“橙色”);
添加(Colors.Black.ToString());
添加(Colors.Black.ToString());
添加(Colors.Brown.ToString());
添加(Colors.Cyan.ToString());
添加(Colors.DarkGray.ToString());
添加(Colors.Gray.ToString());
添加(Colors.Green.ToString());
添加(Colors.LightGray.ToString());
添加(Colors.Magenta.ToString());
添加(Colors.Orange.ToString());
knownColors.Add(“LawnGreen”);
Known颜色。添加(“LemonChiffon”);
已知颜色。添加(“浅蓝色”);
Known颜色。添加(“轻珊瑚”);
已知颜色。添加(“淡青色”);
添加(“淡黄花”);
已知颜色。添加(“浅灰色”);
已知颜色。添加(“浅绿色”);
知道颜色。添加(“淡粉色”);
添加(“轻鲑鱼”);
ShortHandHexColor。添加(“#000”);
ShortHandHexColor。添加(“#111”);
ShortHandHexColor。添加(“#222”);
ShortHandHexColor。添加(“#333”);
ShortHandHexColor。添加(“#444”);
ShortHandHexColor。添加(“#555”);
ShortHandHexColor。添加(“#666”);
ShortHandHexColor。添加(“#777”);
ShortHandHexColor。添加(“#aaa”);
ShortHandHexColor。添加(“#bbb”);
LayoutRoot.DataContext=this;
}
私有列表名称颜色=新列表();
私有列表hexColors=新列表();
私有列表shorthandHexColors=新列表();
私有列表knownColors=新列表();
私有列表namedColumurations=新列表();
私有列表hexColorDurations=新列表();
私有列表shorthandHexColorDurations=新列表();
私有列表KnownColutions=新列表();
私有字符串selectedColor;
公共字符串SelectedColor
{
得到
{
返回所选颜色;
}
设置
{
如果(selectedColor!=值)
{
selectedColor=值;
RaisePropertyChanged(“SelectedColor”);
}
}
}
私有void RaisePropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共事件属性更改事件处理程序属性更改;
私有布尔ISTEST=假;
私有无效测试按钮\u单击(对象发送方,路由目标)
{
如果(ISTEST)
{
返回;
}
其他的
{
IsTest=真;
}
ThreadPool.QueueUserWorkItem(o=>
{
AutoResetEvent resetEvent=新的AutoResetEvent(假);
对于(int i=0;i<10;i++)
{
TestColors(重置事件、hexColors、LstHexColorDurations、hexColorDurations);
resetEvent.WaitOne();
测试颜色(重置事件、命名颜色、lstNamedColorDuration、命名COLORDURATIONS);
resetEvent.WaitOne();
TestColors(重置事件、shorthandHexColors、lstShorthandHexDuration、shorthandHexColorDurations);
resetEvent.WaitOne();
TestColor(重置事件、knownColors、LstKnownColutions、KnownColutions);
resetEvent.WaitOne();
}
Dispatcher.BeginInvoke(()=>
{
lsthexColorDurations.Items.Add(hexColorDurations.Average().ToString());
lstNamedColorDuration.Items.Add(namedColorDurations.Average().ToString());
lstShorthandHexDuration.Items.Add(shorthandHexColorDurations.Average().ToString());
lstnowncolorduration.Items.Add(knownColorDurations.Average().ToString());
});
ISTest=错误
<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>