Silverlight математический вопрос производительности - PullRequest
3 голосов
/ 10 октября 2009

Есть ли какая-то причина, по которой идентичные математические операции в одном приложении Silverlight могут занимать значительно больше времени, чем в другом?

Например, у меня есть некоторый код, который берет список точек и преобразует их (масштабирует и переводит их) и заполняет другой список точек. Важно, чтобы я сохранил исходные точки без изменений, поэтому второй список.

Вот соответствующий код (шкала двойная, а точка начала - точка):

public Point transformPoint(Point point) {
        // scale, then translate the x
        point.X = (point.X - origin.X) * scale;
        // scale, then translate the y
        point.Y = (point.Y - origin.Y) * scale;
        // return the point
        return point;
    }

Вот как я делаю цикл и время, если это важно:

            DateTime startTime = DateTime.Now;
        foreach (Point point in rawPoints) transformedPoints.Add(transformPoint(point));
        Debug.Print("ASPX milliseconds: {0}", (DateTime.Now - startTime).Milliseconds);

При пробеге 14356 баллов (не спрашивайте, он смоделирован с реальным числом в настольном приложении), разбивка выглядит следующим образом:

Приложение Silverlight № 1: 46 мс

Приложение Silverlight №2: 859 мс

Первое приложение - это пустое приложение, которое выполняет цикл в конструкторе MainPage. Второй - выполнение цикла в методе другого класса, и метод, я думаю, вызывается во время обработки события в потоке графического интерфейса. Но должно ли что-то происходить, учитывая, что идентичные операции происходят внутри самого цикла?

Может быть, что-то огромное мне не хватает в том, как работает многопоточность, или что-то в этом роде, но это несоответствие мне вообще не имеет смысла.

Ответы [ 3 ]

2 голосов
/ 11 октября 2009

В дополнение к другим комментариям и ответам я немного прочитаю между строк.

В первом приложении у вас в значительной степени есть этот код, работающий в конструкторе MainPage. IWO вы создали новое приложение Silverlight и добавили в него этот код, вот и все.

Во втором приложении у вас есть больше реальных реальных вещей. По крайней мере, у вас работает этот код в результате нажатия кнопки на элементарном интерфейсе пользователя. В этом и заключается ключ.

Возьмите пустое приложение и поместите на него кнопку. Запустите его и нажмите кнопку, что делает кнопка? Есть анимации, прикрепленные к визуальным состояниям кнопки. Эта анимация (или другие анимации или циклы), вероятно, работают параллельно с вашим кодом, когда вы нажимаете кнопку. Таймеры (независимо от того, правильно ли вы это делаете с помощью StopWatch или нет) записывают истекшее время, а не только время, которое занимает ваш поток. Следовательно, когда другие потоки делают другие вещи (например, анимации), ваше время будет отключено.

1 голос
/ 10 октября 2009

Моим первым подозрением будет то, что Silverlight App # 2 запускает сборку мусора. Масштабирование ~ 15 000 точек должно занимать миллисекунду, , а не почти секунду.

Попробуйте уменьшить объем памяти в вашем коде. Может ли transformPoints быть массивом, а не динамически растущей структурой данных?

Вы также можете посмотреть на счетчики производительности GC , но простое сокращение выделения памяти может оказаться проще.

0 голосов
/ 11 октября 2009

Возможно ли, что ваш код не встроен в CLR приложением, которое работает медленнее?

Я не уверен, как CLR в SL обрабатывает встраивание, но здесь приведена ссылка на некоторые предпосылки для встраивания в 3.5 SP1.

http://udooz.net/blog/2009/04/clr-improvements-in-net-35-sp1/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...