Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 590
#1

Мой упрощенный алгоритм выполняется дольше алгоритма Google - Android

03.02.2015, 16:47. Просмотров 240. Ответов 0
Метки нет (Все метки)

Здравствуйте!
Возник вопрос по скорости выполнения... Я разрабатываю 2D-движок, в принципе работает быстро, но хочется убрать лишние операции, которые не нужны для 2D все равно.
Поэтому код функции Matrix.translateM
Java
1
2
3
4
5
6
7
8
public static void translateM(
            float[] m, int mOffset,
            float x, float y, float z) {
        for (int i=0 ; i<4 ; i++) {
            int mi = mOffset + i;
            m[12 + mi] += m[mi] * x + m[4 + mi] * y + m[8 + mi] * z;
        }
    }
Решил заменить своей, заточенной чисто под перемещение в плоскости:
Java
1
2
3
4
5
6
public static void translate(float[] m, float x, float y) {
        m[12] += m[0] * x + m[4] * y;
        m[13] += m[1] * x + m[5] * y;
        m[14] += m[2] * x + m[6] * y;
        m[15] += m[3] * x + m[7] * y;
    }
Далее решил сравнить скорость выполнения:
Java
1
2
3
4
5
6
7
8
9
10
11
12
long startTime;
        long delta;
        for(int i = 0; i < 10; ++i) {
            startTime = System.nanoTime();
            EasyMatrix.translate(mtrxView, 50f, 50f);
            delta = System.nanoTime() - startTime;
            Log.d(TAG, "Easy matrix time: " + delta);
            startTime = System.nanoTime();
            Matrix.translateM(mtrxView, 0, 50f, 50f, 0f);
            delta = System.nanoTime() - startTime;
            Log.d(TAG, "Android matrix time: " + delta);
        }
Получаю такой вывод:
Кликните здесь для просмотра всего текста
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
02-03 11:19:51.368    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Easy matrix time: 94426
02-03 11:19:51.368    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Android matrix time: 6425
02-03 11:19:51.368    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Easy matrix time: 7263
02-03 11:19:51.368    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Android matrix time: 268470
02-03 11:19:51.368    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Easy matrix time: 6704
02-03 11:19:51.368    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Android matrix time: 6705
02-03 11:19:51.368    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Easy matrix time: 6425
02-03 11:19:51.368    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Android matrix time: 6146
02-03 11:19:51.368    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Easy matrix time: 6146
02-03 11:19:51.369    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Android matrix time: 6425
02-03 11:19:51.369    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Easy matrix time: 9778
02-03 11:19:51.369    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Android matrix time: 6704
02-03 11:19:51.369    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Easy matrix time: 6984
02-03 11:19:51.369    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Android matrix time: 6984
02-03 11:19:51.369    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Easy matrix time: 7543
02-03 11:19:51.369    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Android matrix time: 7264
02-03 11:19:51.369    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Easy matrix time: 6146
02-03 11:19:51.369    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Android matrix time: 6425
02-03 11:19:51.369    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Easy matrix time: 6146
02-03 11:19:51.369    2463-2481/com.contedevel.lastlegend D/EasyRenderer﹕ Android matrix time: 6705


Ну, первое отличие при запуске я еще могу понять... Но, почему далее моя функция проигрывает по времени выполнения? Алгоритм же проще на порядок... Или я неправильно измеряю время выполнения?
Буду очень признателен за подробное объяснение!
P.S. Цикл взял, чтобы среднюю разницу определить.

Добавлено через 2 часа 15 минут
Такой вариант в среднем выполняется быстрее, чем без цикла, что мне тоже не понятно...
Java
1
2
3
4
5
public static void translate(float[] m, float x, float y) {
        for(int i = 0; i < 4; ++i) {
            m[12 + i] += m[i]*x + m[4 + i] * y;
        }
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2015, 16:47     Мой упрощенный алгоритм выполняется дольше алгоритма Google
Посмотрите здесь:

ProgressBar, крутящийся, пока выполняется post-запрос Android
Не выполняется задание таймера Android
Android Не выполняется поиск в ListView
Android Не видит мой смартфон
Android Как добавить библиотеки Google API в мой проект?
Android Зацените мой HelloWorld пожалуйста
Android Некорректно выполняется запрос к SQLite
Не выполняется скачивание файла - программа работает? Android
Где мой файл? Android
Android Не выполняется условие if
Android Genymotion не видит мой проект при запуске через itelij IDEA
Не выполняется сервис android Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 11:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru