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

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

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

Время выполнения функции из C++ и из Java - Android

06.04.2014, 13:02. Просмотров 775. Ответов 8
Метки нет (Все метки)

Здравствуйте!

Пытаюсь оценить время выполнения функции из C++ и из Java. Они устроен одинаково - просто считают сумму, только написаны на разных языках.
Вот на C++:
com_contedevel_tests_SpeedTest.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_contedevel_tests_SpeedTest */
 
#ifndef _Included_com_contedevel_tests_SpeedTest
#define _Included_com_contedevel_tests_SpeedTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_contedevel_tests_SpeedTest
 * Method:    getResult
 * Signature: (I)F
 */
JNIEXPORT jfloat JNICALL Java_com_contedevel_tests_SpeedTest_getResult
  (JNIEnv *, jobject, jint);
 
#ifdef __cplusplus
}
#endif
#endif
tests.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "com_contedevel_tests_SpeedTest.h"
 
JNIEXPORT jfloat JNICALL Java_com_contedevel_tests_SpeedTest_getResult
  (JNIEnv * env, jobject obj, jint n) {
    float tmp = 1.0f;
    for(int i = 0; i < (int)n; i++) {
        tmp += n - i;
    }
    return tmp;
}
А вот сам Java class:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.contedevel.tests;
 
public class SpeedTest {
    public native float getResult(int n);
    
    static {
        System.loadLibrary("tests");
    }
    
    public SpeedTest() {
        
    }
    
    public float getResult2(int n) {
        float tmp = 1.0f;
        for(int i = 0; i < n; i++) {
            tmp += (n - i);
        }
        
        return tmp;
    }
 
}
Так, пытаюсь вычислить время:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.contedevel.tests;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.TimingLogger;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);
        SpeedTest test = new SpeedTest();
        String tmp = "C++\n";
        long nanoS = System.nanoTime();
        float t = test.getResult(50000);
        long nanoE = System.nanoTime();
        tmp += "Result: " + String.valueOf(t) + "\n";
        tmp += "Time: " + String.valueOf(nanoE - nanoS) + "_" + String.valueOf(nanoS) + "_" + String.valueOf(nanoE) + "\n";
        
        tmp += "Java\n";
        nanoS = System.nanoTime();
        float t2 = test.getResult2(50000);
        nanoE = System.nanoTime();
        tmp += "Result: " + String.valueOf(t2) + "\n";
        tmp += "Time: " + String.valueOf(nanoE - nanoS) + "_" + String.valueOf(nanoS) + "_" + String.valueOf(nanoE) + "\n";
        TextView tvTest  = (TextView) findViewById(R.id.testText);
        tvTest.setText(String.valueOf(tmp));
    }
 
}
При запуске приложения C++ код выполняется почти в 2 раза быстрее, однако, при повороте экрана (пересоздании активити) Java выигрывает значительно, разница на порядок. При этом время выполнения того же C++ кода уже отображается почти в 8 раз дольше... Я не понимаю, что я не так делаю? И почему так происходит?

Я понимаю, что на вызов функции из библиотеки и возврата результата требуется время, но не столько же...

Добавлено через 3 минуты
Если кто знает, очень прошу ответить... Пытаемся увеличить производительность движка, вынеся длительные процессы в C++ код, как рекомендует Google собственно, но по этому тесту выходит, что движок еще медлительней станет так.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
EVP
320 / 242 / 43
Регистрация: 14.12.2010
Сообщений: 462
06.04.2014, 14:23     Время выполнения функции из C++ и из Java #2
Цитата Сообщение от contedevel Посмотреть сообщение
почти в 8 раз дольше... Я не понимаю, что я не так делаю? И почему так происходит?
Идея сомнительная весьма - в onCreate() методе производительности замер делать.
Замер в кнопки обработчик перенести следует.
Статистику получите запросов нескольких.
Профилировщики для целей ваших полезны будут.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
06.04.2014, 14:37     Время выполнения функции из C++ и из Java #3
Личного опыта смены оринетации монитора нет(наоборот боролся с этим), но по тому что вычитал...
При смене ориентации куча других процессов запускается. ВСЕ программы получают сообщение и пытаются перестроится (включая ланчер с иконками и панелью заряда). А ваша получив это сообщение пытается запустить onCreate() на фоне остальных...
Послушайтесь совета EVP - тесты проводите в кнопках или других реакторах, а не в момент смены монитора. Согласно тому что я вычитал с++ ВСЕГДА (минимум) в 2 раза быстре явы!
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 596
06.04.2014, 15:07  [ТС]     Время выполнения функции из C++ и из Java #4
Спасибо за ответы, учту! И еще вопрос, сам замер времени выполнения я правильно делаю? Т.е. можно ли таким способом получить правильную оценку производительности?

Добавлено через 8 минут
Изменил код так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package com.contedevel.tests;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.TimingLogger;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);
        final SpeedTest test = new SpeedTest();
        
        final TextView tvTest  = (TextView) findViewById(R.id.testText);
        Button btn = (Button) findViewById(R.id.btn);
        
        btn.setOnClickListener(new OnClickListener() {
 
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String tmp = "C++\n";
                long nanoS = System.nanoTime();
                float t = test.getResult(50000);
                long nanoE = System.nanoTime();
                tmp += "Result: " + String.valueOf(t) + "\n";
                tmp += "Time: " + String.valueOf(nanoE - nanoS) 
                        + "_" + String.valueOf(nanoS) + "_" + String.valueOf(nanoE) + "\n";
                
                tmp += "Java\n";
                nanoS = System.nanoTime();
                float t2 = test.getResult2(50000);
                nanoE = System.nanoTime();
                tmp += "Result: " + String.valueOf(t2) + "\n";
                tmp += "Time: " + String.valueOf(nanoE - nanoS) 
                        + "_" + String.valueOf(nanoS) + "_" + String.valueOf(nanoE) + "\n";
                tvTest.setText(String.valueOf(tmp));
            }});
    }
 
}
Но C++ код все равно выполняется значительно медленнее...
EVP
320 / 242 / 43
Регистрация: 14.12.2010
Сообщений: 462
06.04.2014, 18:52     Время выполнения функции из C++ и из Java #5
Цитата Сообщение от contedevel Посмотреть сообщение
сам замер времени выполнения я правильно делаю? Т.е. можно ли таким способом получить правильную оценку производительности?
Да. Да. (Имеет смысл делать оценку производительности только релизовой сборки)

Цитата Сообщение от contedevel Посмотреть сообщение
Но C++ код все равно выполняется значительно медленнее...
Такое возможно, если в режиме отладки проходить строчку 37 по шагам, сделав на ней паузу.
Если код будет выполняться нормально (без прерываний),
то скорость C++ метода будет минимум на два порядка превосходить скорость Java метода (даже на эмуляторе).
spydark91
85 / 85 / 2
Регистрация: 03.03.2011
Сообщений: 1,873
06.04.2014, 20:11     Время выполнения функции из C++ и из Java #6
спрошу не в тему
но как вы исполняете с++ код из явы?
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 596
06.04.2014, 20:14  [ТС]     Время выполнения функции из C++ и из Java #7
Библиотеку подключаю. Или Вы о чем?
spydark91
85 / 85 / 2
Регистрация: 03.03.2011
Сообщений: 1,873
06.04.2014, 20:19     Время выполнения функции из C++ и из Java #8
об этом самом
скомпилированную?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2014, 13:25     Время выполнения функции из C++ и из Java
Еще ссылки по теме:

Android Изменить имя ресурса во время выполнения программы
Закрыть диалог во время выполнения процесса (принудительное срабатывание dismiss() Android
Парсинг Html после выполнения скриптов Android
Basic4Android Как реализовать паузу во время выполнения программы
Метод Run() порядок выполнения Android

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

Или воспользуйтесь поиском по форуму:
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 596
07.04.2014, 13:25  [ТС]     Время выполнения функции из C++ и из Java #9
Да, сперва компилируется библиотека, а затем уже сборка проекта идет
Yandex
Объявления
07.04.2014, 13:25     Время выполнения функции из C++ и из Java
Ответ Создать тему
Опции темы

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