Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
1

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

06.04.2014, 13:02. Просмотров 890. Ответов 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 собственно, но по этому тесту выходит, что движок еще медлительней станет так.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2014, 13:02
Ответы с готовыми решениями:

Размер view по время выполнения
Здрасте Создаю класс наследованный от view. В нем рисуют на canvas. Только...

Ограничить время выполнения HTTP запроса
Всем привет Имеется код, работающий на отдельном сервисе BufferedReader...

Изменить имя ресурса во время выполнения программы
Доброго времени суток. допустим есть вот такая вещь : rsc =...

Про необновляемость вьюх во время выполнения UI-поток
TextView.setText(&quot;&quot;+555); try{TimeUnit.SECONDS.sleep(10);} catch...

Закрыть диалог во время выполнения процесса (принудительное срабатывание dismiss()
Всем привет! В приложении есть диалоговое окно с кнопкой, по нажатию которой...

8
EVP
506 / 268 / 60
Регистрация: 14.12.2010
Сообщений: 541
06.04.2014, 14:23 2
Цитата Сообщение от contedevel Посмотреть сообщение
почти в 8 раз дольше... Я не понимаю, что я не так делаю? И почему так происходит?
Идея сомнительная весьма - в onCreate() методе производительности замер делать.
Замер в кнопки обработчик перенести следует.
Статистику получите запросов нескольких.
Профилировщики для целей ваших полезны будут.
1
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
06.04.2014, 14:37 3
Личного опыта смены оринетации монитора нет(наоборот боролся с этим), но по тому что вычитал...
При смене ориентации куча других процессов запускается. ВСЕ программы получают сообщение и пытаются перестроится (включая ланчер с иконками и панелью заряда). А ваша получив это сообщение пытается запустить onCreate() на фоне остальных...
Послушайтесь совета EVP - тесты проводите в кнопках или других реакторах, а не в момент смены монитора. Согласно тому что я вычитал с++ ВСЕГДА (минимум) в 2 раза быстре явы!
1
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
06.04.2014, 15:07  [ТС] 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++ код все равно выполняется значительно медленнее...
0
EVP
506 / 268 / 60
Регистрация: 14.12.2010
Сообщений: 541
06.04.2014, 18:52 5
Цитата Сообщение от contedevel Посмотреть сообщение
сам замер времени выполнения я правильно делаю? Т.е. можно ли таким способом получить правильную оценку производительности?
Да. Да. (Имеет смысл делать оценку производительности только релизовой сборки)

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

Как реализовать паузу во время выполнения программы
Как реализовать паузу во время выполнения программы

Прогресс выполнения функции AJAX и время выполнения
Здравствуйте. Как ни странно не нашел ответа на решение своей проблемы. Есть...

время выполнения java
Уважаемые, прошу подсказать, что со временем? $ wc -l...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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