Практические эксперименты на скорость(тесты, исходники, ссылки), на разных языках программирования выкладываем, сравниваем, делаем выводы - страница 2

 

Ну да, скомпилял на Шарпе (VS2008), получился первый тест в точности как mql5, второй - медленнее процентов на 15-20 чем mql5. Вывод: mql5 рулит.. :-)

 

Ребята, у меня вопросик немножко и в тему и не в тему.

Меня интересует, как распределит JVM возможности многоядерного процессора, если в программе на Java используеться несколько thread??

Допустим, есть 2ух ядерный проц, а в программе присутствует 4 потока(в каждом потоке по математическому тесту). Будут ли все 2 ядра одновременно и одинаково обслуживать эту программу?

 

переписал код под Java

public class test{
        public static double a, b, c, d, x, y;
        
        public static void main(String arg[]){
                x = 3.0;
                y = 3.0;
                System.out.println("--- java test1 start ---");
                test1();
                System.out.println("--- java test1 end   ---");
                System.out.println("--- java test2 start ---");
                test2();
                System.out.println("--- java test2 end   ---");
        }
        
        static void test1(){
                for(int i = 0; i < 10; i++){
                        // взять время
                        // Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT represented by this Date object
                        long time1 = (new java.util.Date()).getTime();
                        for(int n = 0; n < 100000000; n++){
                                y += n;
                                a = x + y;
                                b = x - y;
                                c = x * y;
                                d = x / y;
                        }
                        long time2 = (new java.util.Date()).getTime();
                        long delta = time2 - time1;
                        System.out.println("Test #" + i + "  proiden za " + delta + "  millisecund.");
                }
        }
        
        static void test22(float n){
                y += n;
                a = x + y;
                b = x - y;
                c = x * y;
                d = x / y;
        }
        
        static void test2(){
                for(int i = 0; i < 10; i++){
                        // опять взять время
                        long time1 = (new java.util.Date()).getTime();
                        for(int n = 0; n < 10000000; n++){
                                test22((float)n);
                        }
                        long time2 = (new java.util.Date()).getTime();
                        long delta = time2 - time1;
                        System.out.println("Test #" + i + "  proiden za " + delta + "  millisecund.");
                }
        }
}

а вот и рисунок


и данные машины на которой проходило испытание


 

выходит так, что целочисленные значения которые не выносятся в отдельный блок дольше выполняются, чем вещественные которые выносятся в отдельный блок примерно в 6 раз.

забавно, надо поизвращаться со значениями.

 

поизвращался со значениями.

оказывается операция деления занимает львиную долю времени. больше половины всего времени тестов

 
progma137:

Ребята, у меня вопросик немножко и в тему и не в тему.

Меня интересует, как распределит JVM возможности многоядерного процессора, если в программе на Java используеться несколько thread??

Допустим, есть 2ух ядерный проц, а в программе присутствует 4 потока(в каждом потоке по математическому тесту). Будут ли все 2 ядра одновременно и одинаково обслуживать эту программу?


Посмотрите в http://www.google.ru/ многопоточность java

там похоже много вариантов.

 

Рис. 6. Результаты SciMark

C# и наука: применение языковых средств C# в проектах для научных вычислений http://www.microsoft.com/rus/msdn/magazine/2004/03/sciencecomputing.mspx

 

Заблуждение II Максимальная эффективность достижима лишь при программировании на чистом ассемблере, но отнюдь не языке высокого уровня
Перенос программы на ассемблер только в исключительных случаях увеличивает ее эффективность. При трансляции качественного исходного кода, оптимизирующие компиляторы отстают от идеальной ручной оптимизации не более чем на 10%-20%. Конечно, это весьма ощутимая величина, но все же не настолько, чтобы оправдать трудоемкость программирования на чистом ассемблере!
Подробнее о сравнении качества машинной и ручной оптимизации см. "Часть III. Ассемблер vs Компилятор".

стр 14 "Техника оптимизации программ. Эффективное использование памяти"
Автор: Касперски К.

 
// на "c++ vs2010 sp1" Intel® C++ Compiler XE 12.0    110ms и 110ms

//#include <stdlib.h>
//#include "stdafx.h"
//#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <Windows.h>
static float a, b, c, d, x, y; // float      110ms 110ms (microsoft Compiler 360 ms 360 ms), 
                                            // double 110ms 125ms (microsoft Compiler 125 ms 125 ms)
static void Test1()
{
        for(int i = 0; i< 10; i++)
        {
                clock_t start = clock();
                for(int n = 0; n < 100000000; n++)
                {
                        y += n;
                        a = x + y;
                        b = x - y;
                        c = x * y;
                        d = x / y;
                }
                clock_t finish = clock();
                long rez = (long)finish - (long)start;
                printf("%d\n",rez);
        }
}
static void Test22(float n)
{
        y += n;
        a = x + y;
        b = x - y;
        c = x * y;
        d = x / y;
}
static void Test2()
{
        for(int i = 0; i< 10; i++)
        {
                clock_t start = clock();
                for(int n = 0; n < 100000000; n++)
                {
                        Test22((float)n);
                }
                clock_t finish = clock();
                long rez = (long)finish - (long)start;
                printf("%d ms\n",rez);
        }
}
int main()
{
        x = 3.0f;
        y = 2.0f;
        printf("---c++ test1 start---\n");
        Test1();
        printf("---c++ test1 end  ---\n\n");
        printf("---c++ test2 start---\n");
        Test2();
        printf("---c++ test2 end  ---\n\n");
        //у Intel® C++ Compiler XE 12.0 похоже глюк с _getch();(у microsoft Compiler без разницы)
        //_getch(); //если double    с _getch(); 750ms 750ms     без _getch(); 110-125ms
                           //если float         с _getch(); 187ms 187ms     без _getch(); 110-110ms
        system("pause");
        return 0;
}
 
//+------------------------------------------------------------------+
//|                                                    SpeedTest.mq5 |
//|                                 (c) 2010.03.22, Vladimir Gomonov |
//|                                            MetaDriver@rambler.ru |
//+------------------------------------------------------------------+
#property copyright "(c) 2010.03.22, Vladimir Gomonov"
#property link      "MetaDriver@rambler.ru"
#property version   "1.00"

//-------------------------------winXP PRO SP3 intel core 2 quad 9400 2.67Ghz 3,5 ГБ  MetaTrader 5 Build 420
static double a, b, c, d, x, y;// float 4078 ms..4109 ms - test1     1859 ms..1875 ms - test2
                               // double 750 ms..766  ms - test1     859 ms..875 ms   - test2

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
        x = 3.0f;
        y = 2.0f;
        printf("---mql5 test1 start---\n");
        Test1();
        printf("---mql5 test1 end  ---\n");
        printf("---mql5 test2 start---\n");
        Test2();
        printf("---mql5 test2 end  ---\n");
   return;
  }
//+------------------------------------------------------------------+
static void Test1()
{
        for(int i = 0; i< 10; i++)
        {
                datetime start = GetTickCount();
                for(int n = 0; n < 100000000; n++)
                {
                        y += n;
                        a = x + y;
                        b = x - y;
                        c = x * y;
                        d = x / y;
                }
                datetime finish = GetTickCount();
                long rez = (long)finish - (long)start;
                printf("%d\n",rez);
        }
}
static void Test22(float n)
{
        y += n;
        a = x + y;
        b = x - y;
        c = x * y;
        d = x / y;
}
static void Test2()
{
        for(int i = 0; i< 10; i++)
        {
                datetime start = GetTickCount();
                for(int n = 0; n < 100000000; n++)
                {
                        Test22((float)n);
                }
                datetime finish = GetTickCount();
                long rez = (long)finish - (long)start;
                printf("%d ms\n",rez);
        }
}