Скорость цветового разрешения в XAML (Silverlight) - PullRequest
1 голос
/ 05 января 2011

Можно ли в любом случае скоростное тестирование, какое из следующих разрешений быстрее в XAML для цветов:

Named Color: <b>Orange</b>
Hex: <b>#ff6600</b>
Shorthand Hex: <b>#f60</b>
Known Color: <b>DarkOrange</b>

Это не просто любопытство или академическое упражнение.У меня есть тонны и тонны анимаций и цветов, которые меняют цвета много раз, в больших масштабах.Мне нужно как можно больше сэкономить время.

Ищите способ проверить вышеупомянутое в сравнении с Silverlight.Есть идеи?

1 Ответ

3 голосов
/ 21 января 2011

Я не мог придумать окончательного способа проверить это, но я собрал кое-что, что может дать вам подсказку.По сути, я связал цвет прямоугольника со свойством (string) SelectedColor класса, который вызывал событие PropertyChanged при каждом его изменении.Затем я создал четыре разных коллекции List, в которых цвета были определены всеми различными способами, которые вы описали, и в фоновом потоке перебирал их каждые примерно 10000 раз, устанавливая свойство SelectedColor в каждом цикле, отправляя обратно в поток пользовательского интерфейса.Сложной частью было просто правильно синхронизировать все потоки, и там был по крайней мере один хак, где я повторял каждые 20 мс, пока не увидел, что предыдущая задача завершена.Но это по крайней мере вынуждает поток пользовательского интерфейса анализировать цветовую строку, что, по-видимому, является тем, что вас интересует.

Во всяком случае, в той степени, в которой эта методология проверки действительна, похоже на использование "шестнадцатеричная нотация, возможно, немного быстрее, чем другие, хотя и ненамного.Средние результаты на моей машине после 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...