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

 

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

Проверять имеет смысл на маленьких программах( т.к.относительно большие слишком долго сравнивать на адекватность алгоритма).

Интересуют все языки, особенно такие: c++, c, c#, Java, mq4, mq5, assembler.

Все тесты с указанием параметров компьютера операционки и компиляторов(например intel, microsoft) с максимальной оптимизацией по скорости(relise).

На компьютере core winXP PRO SP3 intel core 2 quad 9400 2.67Ghz 3,5 ГБ ОЗУ тест от Рената http://www.metatrader4.com/ru/forum/7551 (с небольшими изменениями)

компилятор vs6,vs2010 - microsoft

// на "c vs6" 15 ms или 31

// на "mq4" 234 ms (229 build)

// на "c++ vs2010" 15 ms или 31ms

// на "mq5" 62 ms или 78 ms (412 build)

// на "c# vs2010" 67ms или 68ms

TEST1.txt

// на "c++ vs2010"  15 ms или 31ms

#include "stdafx.h"
#include <conio.h>
#include <time.h>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void main()
{
        int    res_int=0,i,start_time;
        double res_double=0;
        //----
        start_time=clock();
        for(i=0;i<=10000000;i++)
        {
                res_int+=i*i;
                res_int++;
                res_double+=i*i;
                res_double++;
        }
        start_time=clock()-start_time;
        //---- вывод результатов
        printf("Time: %d ms, ResInt=%d ResDouble=%.0lf\n",start_time,res_int,res_double);
        //----
        _getche();
}

Конвертеры между VB, C#, C++ & Java (Instant C#, Instant C++, Instant VB, C++ to C#/VB/Java, Java to VB & C#, VB & C# to Java) не всё правильно, но может кому пригодятся https://www.mql5.com/go?link=http://rutracker.org/forum/viewtopic.php?t=1734855

Файлы:
test1.rar  1 kb
 

И какова цель этих экспериментов?

Если уж замерять,то надо замерять по правилам, сколько то таких операций, сколько то таких. А чего перебор чисел замерять. Да и точность до микросекунд поднять.

 
// на "c++ vs2010"  125 ms

#include "stdafx.h"
#include <time.h>
static double a, b, c, d, x, y;
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);
        }
}
static int _tmain(int argc, _TCHAR* argv[])
{
        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");
        return 0;
}
 
// на "c# vs2010" 622ms И 827ms
using System;
using System.Diagnostics;
namespace csharpTest
{
    class Program
    {
        static float a, b, c, d, x, y;
        static void Main(string[] args)
        {
            x = 3.0f;
            y = 2.0f;
            Console.WriteLine("--- c# test1 start---");
            Test1();
            Console.WriteLine("--- c# test1 end  ---\n");
            Console.WriteLine("--- c# test2 start---");
            Test2();
            Console.WriteLine("--- c# test2 end  ---");
        }
        static void Test1()
        {
            Stopwatch time;
            for (int i = 0; i < 10; i++)
            {
                time = Stopwatch.StartNew();
                time.Start();
                for (int n = 0; n < 100000000; n++)
                {
                    y += n;
                    a = x + y;
                    b = x - y;
                    c = x * y;
                    d = x / y;
                }
                time.Stop();
                Console.WriteLine(time.ElapsedMilliseconds);
            }
        }
        static void Test2()
        {
            Stopwatch time;
            for (int i = 0; i < 10; i++)
            {
                time = Stopwatch.StartNew();
                time.Start();
                for (int n = 0; n < 100000000; n++)
                {
                    Test22((float)n);
                }
                time.Stop();
                Console.WriteLine(time.ElapsedMilliseconds);
            }
        }
        static void Test22(float n)
        {
            y += n;
            a = x + y;
            b = x - y;
            c = x * y;
            d = x / y;
        }
    }
}
 
zhuki:

И какова цель этих экспериментов?

Если уж замерять,то надо замерять по правилам, сколько то таких операций, сколько то таких. А чего перебор чисел замерять. Да и точность до микросекунд поднять.


Пожалуйста добавляйте свои варианты.

Гдето читал что в windows можно измерить только милисекунды да и то не точно.

// на "c# vs2010" 843ms И 867ms
using System;
using System.Diagnostics;
namespace csharpTest
{
    class Program
    {
        static double a, b, c, d, x, y; //меняем на double 
        static void Main(string[] args)
        {
            x = 3.0f;
            y = 2.0f;
            Console.WriteLine("--- c# test1 start---");
            Test1();
            Console.WriteLine("--- c# test1 end  ---\n");
            Console.WriteLine("--- c# test2 start---");
            Test2();
            Console.WriteLine("--- c# test2 end  ---");
        }
        static void Test1()
        {
            Stopwatch time;
            for (int i = 0; i < 10; i++)
            {
                time = Stopwatch.StartNew();
                time.Start();
                for (int n = 0; n < 100000000; n++)
                {
                    y += n;
                    a = x + y;
                    b = x - y;
                    c = x * y;
                    d = x / y;
                }
                time.Stop();
                Console.WriteLine(time.ElapsedMilliseconds);
            }
        }
        static void Test2()
        {
            Stopwatch time;
            for (int i = 0; i < 10; i++)
            {
                time = Stopwatch.StartNew();
                time.Start();
                for (int n = 0; n < 100000000; n++)
                {
                    Test22((float)n);
                }
                time.Stop();
                Console.WriteLine(time.ElapsedMilliseconds);
            }
        }
        static void Test22(float n)
        {
            y += n;
            a = x + y;
            b = x - y;
            c = x * y;
            d = x / y;
        }
    }
}
 
// на "c++ vs2010" 360 ms и 360 ms

#include "stdafx.h"
#include <time.h>
static float a, b, c, d, x, y; //меняем на float 
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);
        }
}
static int _tmain(int argc, _TCHAR* argv[])
{
        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");
        return 0;
}
http://www.xnadev.ru/forum/viewthread.php?thread_id=391&rowstart=20
 

(делая невинные глаза) Предлагаю замерять скорость залива бабла.

Вот тока проги подходящей под рукой нет...

 
serferrer:


Гдето читал что в windows можно измерить только милисекунды да и то не точно.

Для справки можно замерять временные промежутки с точностью до микросекунд(3 знака). Где то здесь я примерчик показывал.
 
100 процентов Assembler (причем именно низкий уровень). Код более чистый. Этож как криво писать надо что прога на асме была медленнее чем такая же прога написанная на другом (высоком) языке.
 


Смертельная схватка:Ассемблер vs. Компилятор СТР 441

Хронология оптимизации парольного переборщика СТР 91

Книга: Техника оптимизации программ. Эффективное использование памяти
Автор: Касперски К.
Страниц: 464
Год издания: 2003

Формат: djvu
Размер: 7 Мб + 5 Мб (исходный код)

http://progbook.ru/technologiya-programmirovaniya/617-kasperski-tehnika-optimizatsii-programm.html


Компиляторы C и C++

В этом разделе будет тоже два участника — Microsoft Visual C++ 6.0 SP5 и Intel C/C++ Compiler 5.01. При появлении других интересных компиляторов мы постараемся обновить эти результаты. Кстати, если учесть, что Visual C++ является самым популярным компилятором C/C++ сегодня, то становится интересно, стоит ли доверять знаменитому качеству Microsoft...

https://www.mql5.com/go?link=http://www.ixbt.com/cpu/insidespeccpu2000-compilers.shtml


Самый быстрый исполняемый код
Как вы думаете/знаете на каком в данный момент языке/компиляторе получается самый производительный код.
Зависит ли это от задач которые выполняет данный код.
Правда ли что современные компиляторы с++ оптимизируют код так, что он получается быстрее чем, если бы писать код на ассемблере.

https://www.mql5.com/go?link=https://toster.ru//

 

MQL5 :

// 1422 ms..1700 ms - test1
// 1969 ms..2375 ms - test2 указаны диапазоны, на разных проходах результат разный

//+------------------------------------------------------------------+
//|                                                    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"

static double a, b, c, d, x, y;

//+------------------------------------------------------------------+
//| 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);
        }
}

Но у меня процессор тормозной - Sempron 3100+ PR40 32x

На нормальном проце скорее всего будет скорость примерно как на C#