Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5 6 7 8 9 10 .. 41   вперед  Ctrl
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34387
Репо нашёл.
Дайте доступ, пользователь masterziv.

И я полагаю, структура уже нормальная.
5 сен 15, 12:16    [18112474]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 38329
MasterZiv
Репо нашёл.
Дайте доступ, пользователь masterziv

Добавил. Пробуй
5 сен 15, 12:30    [18112493]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 38329
Вопрос ко всем. Как подготовить общую статистику?

Можно в корне создать файл типа runAll.cmd, runAll.sh. С содержанием типа.

#!/bin/sh
timethis Card-retracer >> report.txt
timethis java mayton.CardRetracer >> report.txt
rhino Card-retracer.js
#jsc Card-retracer.js
#node Card-retracer.js
timethis python Card-retracer.py


Далее трудности. Стандартное приложение делает выхлоп в STDOUT. Timethis
смешивается с картинкой. Надо либо отключить вывод С++ приложения либо
сделать его перенаправляемым.

Плюс еще надо как-то отформатировать вывод чтоб был табличный вид. Если
кто-то заксриптует обработку timethis - буду рад.
5 сен 15, 12:42    [18112511]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 38329
Dima T
Читаю "Дж.Рихтер CLR via C#. Программирование на платформе Microsoft .NET Framework 4.0 на языке C#"

А есть в pdf-формате. (Я читаю на E-Book обычно).
5 сен 15, 12:43    [18112513]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
Dima T
Member

Откуда:
Сообщений: 13027
mayton
Dima T, так и не получилось с checkout?

Нет. Точнее в линуксе получилось, там все работает с коммандной строки "svn checkout --username=dmitriyt svn+ssh://dmitriyt@svn..."

А в виндовсе через гуй нивкакую. В проводнике права кнопка мыши, SVN Checkout, ввожу урл "svn+ssh://dmitriyt@svn.code.sf.net/p/card-raytracer-bench/code/ card-raytracer-bench-code", несколько раз пароль спрашивает, в итоге
Error 'svn+ssh://dmitriyt@svn.code.sf.net/p/card-raytracer-bench/code/%20card-raytracer-bench-code' doesn`t exist

Есть подозрения что в пробеле дело, который на %20 заменяется.

Может кто подскажет как в виндовсе с командной строки svn использовать?
5 сен 15, 12:44    [18112516]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 38329
Через пробел вводится второй аргумент который в твоём случае не нужен.
5 сен 15, 13:01    [18112554]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 38329
Зимаргл
mayton
пропущено...

Это в каком компилляторе? VC, Gcc?

http://dlang.org

Раз пошла такая пьянка - можно добавить порт на Dlang. И на Google Golang.
5 сен 15, 13:09    [18112574]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
petalvik
Member

Откуда:
Сообщений: 673
Я думаю, результат бенчмарка заранее предсказуем: победит C; Java и C# будут примерно одинаковы (по-разному в разных условиях); Python - тут зависит от того, как писать: если использовать математические библиотеки, написанные на C, то он обгонит C#/Java, если писать без них - отстанет.

Посмотрел код Dima T. В нём можно заменить
Convert.ToDouble(rand.Next(32768)) / 32768;
на
rand.NextDouble();

Можно навесить атрибут
[MethodImpl(MethodImplOptions.AggressiveInlining)]
на методы Random, tracer, sampler. Собственно, C победит как раз за счёт того, что компилятор сделает оптимизации: заинлайнит методы, развернёт циклы. Этот атрибут подскажет компилятор шарпу сделать инлайнинг, но тоже без гарантии.
А циклы только вручную разворачивать.

Ещё желательно Vector сделать структурой - struct, вместо класса.
5 сен 15, 14:09    [18112657]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 38329
petalvik
Я думаю, результат бенчмарка заранее предсказуем: победит C; Java и C# будут примерно одинаковы (по-разному в разных условиях); Python - тут зависит от того, как писать: если использовать математические библиотеки, написанные на C, то он обгонит C#/Java, если писать без них - отстанет.

Это 1-я фаза (CPU) тестирования на платформерах. Собственно я тоже уже знаю результат.
Но меня интересуют индексы производительности. Я человек - дотошный. И я эти индексы
запомню. И в технических дискурсах у меня будет аргумент на который я буду постоянно
ссылаться. Неопровержимый. Рукотворный. Обсуждённый со всех сторон. Опенсорцный.
Оптимизированный в рамках наших возможностей. Собственно можно было ссылаться
на SciMark. Однако форма подачи материала в скаймарке мне не понравилась. Не было
категорий тестирования. У меня эти категории будут.
5 сен 15, 14:15    [18112663]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный бенчмарк CPU (part-1)  [new]
petalvik
Member

Откуда:
Сообщений: 673
Чуть изменил код Дмитрия.
+
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.CompilerServices;
using System.Text;

namespace TestTraycer
{
    public struct Vector
    {
        public Double x, y, z;

        public Vector(Double a, Double b, Double c)
        {
            x = a;
            y = b;
            z = c;
        }

        public static Vector operator +(Vector v, Vector r)
        {
            return new Vector(v.x + r.x, v.y + r.y, v.z + r.z);
        }

        public static Vector operator *(Vector v, Double r)
        {
            return new Vector(v.x * r, v.y * r, v.z * r);
        }

        public static Double operator %(Vector v, Vector r)
        {
            return v.x * r.x + v.y * r.y + v.z * r.z;
        }

        public static Vector operator ^(Vector v, Vector r)
        {
            return new Vector(v.y * r.z - v.z * r.y, v.z * r.x - v.x * r.z, v.x * r.y - v.y * r.x);
        }

        public static Vector operator !(Vector v)
        {
            return v * (1 / Math.Sqrt(v % v));
        }
    };

    class Program
    {
        static Random rand = new Random();

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        static Double Random()
        {
            return rand.NextDouble();
        }

        static Int32[] G = new Int32[] { 
	        0x0003C712,  // 00111100011100010010 
	        0x00044814,  // 01000100100000010100
	        0x00044818,  // 01000100100000011000
	        0x0003CF94,  // 00111100111110010100
	        0x00004892,  // 00000100100010010010
	        0x00004891,  // 00000100100010010001
	        0x00038710,  // 00111000011100010000
	        0x00000010,  // 00000000000000010000
	        0x00000010,  // 00000000000000010000
        };

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        static Int32 tracer(Vector o, Vector d, out Double t, ref Vector n)
        {
            t = 1e9;
            Int32 m = 0;
            Double p = -o.z / d.z;
            if (.01 < p)
            {
                t = p;
                n = new Vector(0, 0, 1);
                m = 1;
            }
            for (Int32 k = 18; k >= 0; k--)
                for (Int32 j = 8; j >= 0; j--)
                    if ((G[j] & 1 << k) != 0)
                    {
                        Vector vp = o + new Vector(-k, 0, -j - 4);
                        Double b = vp % d;
                        Double c = vp % vp - 1;
                        Double q = b * b - c;
                        if (q > 0)
                        {
                            Double s = -b - Math.Sqrt(q);
                            if (s < t && s > .01)
                            {
                                t = s;
                                n = !(vp + d * t);
                                m = 2;
                            }
                        }
                    }
            return m;
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        static Vector sampler(Vector o, Vector d)
        {
            Double t;
            Vector n = new Vector(0, 0, 1);
            Int32 m = tracer(o, d, out t, ref n);
            if (m == 0)
            {
                return new Vector(.7, .6, 1) * Math.Pow(1 - d.z, 4);
            }
            Vector h = o + d * t;
            Vector l = !(new Vector(9 + Random(), 9 + Random(), 16) + h * -1);
            Vector r = d + n * (n % d * -2);
            Double b = l % n;
            if (b < 0 || tracer(h, l, out t, ref n) != 0)
            {
                b = 0;
            }
            Double p = Math.Pow(l % r * ((b > 0) ? 1 : 0), 99);
            if ((m & 1) != 0)
            {
                h = h * .2;
                return ((((Int32)(Math.Ceiling(h.x) + Math.Ceiling(h.y)) & 1) != 0) ? new Vector(3, 1, 1) : new Vector(3, 3, 3)) * (b * .2 + .1);
            }
            return new Vector(p, p, p) + sampler(h, r) * .5;
        }

        static void Main(string[] args)
        {
            Stopwatch sw = Stopwatch.StartNew();            

            var outs = new FileStream("1.ppm", FileMode.Create);            
            byte[] tmp = Encoding.ASCII.GetBytes("P6 512 512 255 ");
            outs.Write(tmp, 0, tmp.Length);

            Vector g = !new Vector(-6, -16, 0);
            Vector a = !(new Vector(0, 0, 1) ^ g) * .002;
            Vector b = !(g ^ a) * .002;
            Vector c = (a + b) * -256 + g;
            Vector temp = new Vector(17, 16, 8);

            for (int y = 511; y >= 0; y--)
            {
                for (int x = 511; x >= 0; x--)
                {
                    Vector p = new Vector(13, 13, 13); ;
                    for (Int32 r = 63; r >= 0; r--)
                    {
                        Vector t = a * (Random() - .5) * 99 + b * (Random() - .5) * 99;
                        p = sampler(temp + t, !(t * -1 + (a * (Random() + x) + b * (y + Random()) + c) * 16)) * 3.5 + p;
                    }
                    outs.WriteByte((Byte)p.x);
                    outs.WriteByte((Byte)p.y);
                    outs.WriteByte((Byte)p.z);
                }
            }

            sw.Stop();
            File.WriteAllText("test.txt", "Dima T + me: " + sw.ElapsedMilliseconds);
        }
    }
}

Кроме структуры и инлайнинга, сделал ещё прямой вывод в файл.
Получились такие результаты:

ms
Original Dima T176114
Dima T + me113720

Intel Core2 Duo T5750 2.00 GHz
Win 8.1 32-bit

Пробовал ещё буферизацию вывода сделать:
var fs = new FileStream("1.ppm", FileMode.Create);
var outs = new BufferedStream(fs);
Результат остался тот же, в пределах погрешности. Теперь с чистой душой могу быть уверенным, что IO не влияет на тест.

Надо бы потестить, что именно улучшило результат:
  • прямой вывод в файл vs перенаправление вывода из консоли,
  • структура vs класс,
  • инлайнинг vs без него.
  • 5 сен 15, 15:58    [18112857]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 38329
    petalvik
    Надо бы потестить, что именно улучшило результат:
  • прямой вывод в файл vs перенаправление вывода из консоли,
  • структура vs класс,
  • инлайнинг vs без него.

  • Не заморачивайтесь на I/O. Лучше выключите его вообще и соберите цифры по скорости.

    Бенчмарк I/O будет отдельным топиком.
    5 сен 15, 16:47    [18112970]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 38329
    Моё портирование идёт медленно. После инфиксной формы записи операций - переписывать ее
    на префиксную - страшно гиморрно. Есть вероятность завтыкать скобочку и поменять кардинально
    смысл операции. Решил до поры до времени не удалять оригинальный С++ код а оставлять его
    в виде каментов.

     public void process() {
            PrintWriter wr = new PrintWriter(out);
            wr.printf("P6 %d %d 255 ", width, height);
            // TODO: Implement
            // Vector g = !Vector(-6, -16, 0);
            Vector g = new Vector(-6.0, -16.0, 0.0).inv();
            // Vector a = !(Vector(0, 0, 1) ^ g) * .002;
            Vector a = (new Vector(0.0, 0.0, 1.0).mulx(g)).inv().mul(0.002);
            // Vector b = !(g ^ a) * .002;
            Vector b = g.mulx(a).inv().mul(0.002);
            // Vector c = (a + b) * -256 + g;
            Vector c = a.sum(b).mul(-256.0).sum(g);
            for (int y = height; y >= 0; y--) {
                for (int x = width; x >= 0; x--) {
                    Vector p = new Vector(13.0, 13.0, 13.0);
                    for (int r = 64; r >= 0 ; r--) {
                        //Vector t = a * (Random() - .5) * 99 + b * (Random() - .5) * 99;
                        Vector t = a.mul(Random() - 0.5).mul(99.0).sum(b.mul(Random() - 0.5).mul(99.0));
                        //p = sampler(Vector(17, 16, 8) + t,
                        //           !(t * -1 + (a * (Random() + x) + b * (y + Random()) + c) * 16)) * 3.5 + p;
                        p = sampler(
                                new Vector(17.0, 16.0, 8.0).sum(t),
                                t.mul(-1.0).sum(a.mul(Random() + x).sum(b.mul(y + Random()).sum(c)).mul(16.0)).mul(3.5).sum(p).inv()
                        );
                    }
                    //printf("%c%c%c", (int) p.x, (int) p.y, (int) p.z);
                    wr.printf("%02X%02X%02X", (int) p.x, (int) p.y, (int) p.z);
                }
                wr.print("\n");
            }
        }
    
    5 сен 15, 17:39    [18113137]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    drsm
    Member

    Откуда:
    Сообщений: 234
    mayton
    Моё портирование идёт медленно. После инфиксной формы записи операций - переписывать ее
    на префиксную - страшно гиморрно. Есть вероятность завтыкать скобочку и поменять кардинально
    смысл операции. Решил до поры до времени не удалять оригинальный С++ код а оставлять его
    в виде каментов.

     public void process() {
                        //p = sampler(Vector(17, 16, 8) + t,
                        //           !(t * -1 + (a * (Random() + x) + b * (y + Random()) + c) * 16)) * 3.5 + p;
                        p = sampler(
                                new Vector(17.0, 16.0, 8.0).sum(t),
                                t.mul(-1.0).sum(a.mul(Random() + x).sum(b.mul(y + Random()).sum(c)).mul(16.0)).mul(3.5).sum(p).inv()
                        );
                    }
     
    

    это не верно, надо так:
    p = sampler((v6).sum(t),
    	t.mul(-1).sum(a.mul(rnd() + x).sum(b.mul(rnd() + y)).sum(c).mul(16)).inv()
    ).mul(3.5).sum(p);
    


    больше всего я тупил когда у меня картинка получалась кверху ногами из-за )))

    	let b = a.mulx(g).inv().mul(.002);
    // вместо
    	let b = g.mulx(a).inv().mul(.002);
    
    5 сен 15, 17:52    [18113163]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Изопропил
    Member

    Откуда:
    Сообщений: 30895
    petalvik
    Надо бы потестить, что именно улучшило результат:
  • прямой вывод в файл vs перенаправление вывода из консоли,
  • структура vs класс,
  • инлайнинг vs без него.

  • не поможет
    ибо
    ввод-вывод много быстрее вычислений в данном случае
    инлайнинг gcc сам сделает,
    struct vs class - это заморочки c#


    неверующие могут посмотреть ассемблерное порождение
    5 сен 15, 18:44    [18113255]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13027
    mayton
    Через пробел вводится второй аргумент который в твоём случае не нужен.

    Убрал. Помогло.
    5 сен 15, 18:56    [18113275]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 38329
    Я задумался о static - и non-static декларации метода в Java. Возможно это
    влияет на скорость каллбэка. Но сначала посчитаю количество вызовов.

    Есть еще некоторые мыслы касаемые Double wrappers. С точки зрения
    Java они - immutable. Тоесть чтобы передать Double by ref - нужна другая
    обёртка. Вот такие пироги.

    drsm - спасибо. Пофиксил.
    5 сен 15, 18:56    [18113276]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Dima T
    Member

    Откуда:
    Сообщений: 13027
    petalvik
    Надо бы потестить, что именно улучшило результат:
  • прямой вывод в файл vs перенаправление вывода из консоли,
  • структура vs класс,
  • инлайнинг vs без него.

  • Это все микротюнинг.
    По хорошему там надо избавляться от перегруженных операторов, т.к. в каждом new. Исходный код на С++ эту проблему решает в стэке, а тут постоянное создание новых объектов, отсюда тормоз. Надо алгоритм перестраивать так чтобы new было по минимуму.

    Копаю в эту сторону.
    5 сен 15, 19:10    [18113298]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 38329
    Посчитал. Для дефолтной картинки 512 на 512:

    Tracer callbacks: 36 326 649
    Sampler callbacks: 23 240 230
    5 сен 15, 19:14    [18113308]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    petalvik
    Member

    Откуда:
    Сообщений: 673
    Потестил в разных вариантах код на C#.
    Сделал вывод в MemoryStream:
    var outs = new MemoryStream(1000000);
    
    Результат практически не меняется. Хоть с указанием размера буфера, хоть без него.

    С атрибутом-хинтом инлайнинга и без него - результат меняется в пределах погрешности.

    А вот применение структуры вместо класса даёт полуторакратное ускорение. На моём стареньком ноуте время с классом в пределах 171-178 сек, со структурой - 113-123 сек.
    5 сен 15, 19:15    [18113309]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    petalvik
    Member

    Откуда:
    Сообщений: 673
    Изопропил
    ввод-вывод много быстрее вычислений в данном случае
    Это верно.
    Изопропил
    инлайнинг gcc сам сделает
    Компилятор шарпа поступает из своих соображений, не всегда эффективно.

    Изопропил
    struct vs class - это заморочки c#
    Совершенно верно. Но именно применение структур практически всегда эффективнее по быстродействию. Только при этом ошибок наделать легче. Но в данном алгоритме проблем нет.


    Dima T
    Это все микротюнинг.
    По хорошему там надо избавляться от перегруженных операторов, т.к. в каждом new. Исходный код на С++ эту проблему решает в стэке, а тут постоянное создание новых объектов, отсюда тормоз. Надо алгоритм перестраивать так чтобы new было по минимуму.

    Копаю в эту сторону.

    В дотнете память для локальных структур тоже выделяется на стеке. Как показали мои замеры, ускорение существенное.
    5 сен 15, 19:21    [18113324]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 38329
    Коллеги у кого среда с профайлером - прошу дать сведения где у нас самые интенсивные
    вычисления.
    5 сен 15, 19:39    [18113357]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    kealon(Ruslan)
    Member

    Откуда: Нижневартовск
    Сообщений: 3773
    mayton,

    надо бы генератор случайных чисел один для всех использовать
    предлагаю вот такой, самый примитивный но пойдёт для этого случая
     #define M 1048576 // 2^20
     #define J  2045
    int  oldI =12357;
    
    
    double Random() {
       oldI=(oldI*J+1)% M;
       return (double)  oldI/ M;
    	//return (double) rand() / RAND_MAX;
    }
    
    6 сен 15, 09:46    [18114500]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34387
    Dima T
    А в виндовсе через гуй нивкакую. В проводнике права кнопка мыши, SVN Checkout, ввожу урл "svn+ssh://dmitriyt@svn.code.sf.net


    svn+ssh:// --врядли этот URL верен.
    Но если знаешь, что делаешь -- вперёд.
    Не получается в GUI -- поставь обычный SVN, комманд-лайн. Если у тебя Tortoise, или ещё что-то, там комманд-лайн клиента нет вообще (кажется), они через протокол работают. Надо найти и поставить именно SVN. Это сложновато, потому что Tortoise делают
    сразу под винду, а SVN под винду собирает какая-то коммерческая контора, но раздаёт бесплатно, вот найти её трудно.
    Хотя может уже всё 10 раз поменялось...


    Dima T
    Может кто подскажет как в виндовсе с командной строки svn использовать?



    Точно так же, как и в линуксе. :-)
    6 сен 15, 09:58    [18114509]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34387
    Написал пор на Python.
    Запустил.
    До сих пор работает...
    :-)
    6 сен 15, 10:00    [18114510]     Ответить | Цитировать Сообщить модератору
     Re: Тяпничный бенчмарк CPU (part-1)  [new]
    Изопропил
    Member

    Откуда:
    Сообщений: 30895
    kealon(Ruslan)
    надо бы генератор случайных чисел один для всех использовать

    это не поможет аутсайдерам и не повредит лидеру
    mayton
    Коллеги у кого среда с профайлером - прошу дать сведения где у нас самые интенсивные
    вычисления.

    при отключении оптимизации картина такова
    +
    Flat profile:

    Each sample counts as 0.01 seconds.
    % cumulative self self total
    time seconds seconds calls us/call us/call name
    32.56 44.98 44.98 _mcount_private
    27.43 82.87 37.89 36326635 1.04 1.74 tracer(Vector, Vector, double&, Vector&)
    18.58 108.53 25.66 __fentry__
    10.22 122.65 14.12 3644910704 0.00 0.00 Vector::operator%(Vector)
    5.13 129.73 7.08 4065901530 0.00 0.00 Vector::Vector(double, double, double)
    4.08 135.36 5.63 1941229839 0.00 0.00 Vector::operator+(Vector)
    0.53 136.09 0.73 16777216 0.04 3.89 sampler(Vector, Vector)
    0.48 136.75 0.66 95158952 0.01 0.01 Random()
    0.41 137.32 0.57 278720760 0.00 0.00 Vector::operator*(double)
    0.28 137.71 0.39 main
    0.27 138.08 0.37 42825342 0.01 0.02 Vector::operator!()
    0.01 138.10 0.02 23240431 0.00 0.00 Vector::Vector()
    0.01 138.11 0.01 pow
    0.01 138.12 0.01 rand
    0.01 138.13 0.01 sqrt
    0.00 138.13 0.00 2 0.00 0.00 Vector::operator^(Vector)

    % the percentage of the total running time of the
    time program used by this function.

    cumulative a running sum of the number of seconds accounted
    seconds for by this function and those listed above it.

    self the number of seconds accounted for by this
    seconds function alone. This is the major sort for this
    listing.

    calls the number of times this function was invoked, if
    this function is profiled, else blank.

    self the average number of milliseconds spent in this
    ms/call function per call, if this function is profiled,
    else blank.

    total the average number of milliseconds spent in this
    ms/call function and its descendents per call, if this
    function is profiled, else blank.

    name the name of the function. This is the minor sort
    for this listing. The index shows the location of
    the function in the gprof listing. If the index is
    in parenthesis it shows where it would appear in
    the gprof listing if it were to be printed.

    Copyright (C) 2012-2014 Free Software Foundation, Inc.

    Copying and distribution of this file, with or without modification,
    are permitted in any medium without royalty provided the copyright
    notice and this notice are preserved.

    Call graph (explanation follows)


    granularity: each sample hit covers 4 byte(s) for 0.01% of 138.13 seconds

    index % time self children called name
    <spontaneous>
    [1] 48.8 0.39 67.08 main [1]
    0.73 64.53 16777216/16777216 sampler(Vector, Vector) [2]
    0.31 0.26 150994947/278720760 Vector::operator*(double) [9]
    0.29 0.18 100663298/1941229839 Vector::operator+(Vector) [7]
    0.47 0.00 67108864/95158952 Random() [11]
    0.14 0.13 16777219/42825342 Vector::operator!() [10]
    0.03 0.00 17039362/4065901530 Vector::Vector(double, double, double) [8]
    0.00 0.00 2/2 Vector::operator^(Vector) [16]
    -----------------------------------------------
    6463215 sampler(Vector, Vector) [2]
    0.73 64.53 16777216/16777216 main [1]
    [2] 47.3 0.73 64.53 16777216+6463215 sampler(Vector, Vector) [2]
    37.89 25.47 36326635/36326635 tracer(Vector, Vector, double&, Vector&) [3]
    0.15 0.13 72877392/278720760 Vector::operator*(double) [9]
    0.12 0.11 14025044/42825342 Vector::operator!() [10]
    0.14 0.08 48538347/1941229839 Vector::operator+(Vector) [7]
    0.19 0.00 28050088/95158952 Random() [11]
    0.16 0.00 42075132/3644910704 Vector::operator%(Vector) [6]
    0.06 0.00 37265475/4065901530 Vector::Vector(double, double, double) [8]
    0.02 0.00 23240431/23240431 Vector::Vector() [12]
    6463215 sampler(Vector, Vector) [2]
    -----------------------------------------------
    37.89 25.47 36326635/36326635 sampler(Vector, Vector) [2]
    [3] 45.9 37.89 25.47 36326635 tracer(Vector, Vector, double&, Vector&) [3]
    13.79 0.00 3560010230/3644910704 Vector::operator%(Vector) [6]
    5.20 3.12 1792028194/1941229839 Vector::operator+(Vector) [7]
    3.12 0.00 1791646092/4065901530 Vector::Vector(double, double, double) [8]
    0.10 0.09 12023079/42825342 Vector::operator!() [10]
    0.02 0.02 12023079/278720760 Vector::operator*(double) [9]
    -----------------------------------------------
    <spontaneous>
    [4] 32.6 44.98 0.00 _mcount_private [4]
    -----------------------------------------------
    <spontaneous>
    [5] 18.6 25.66 0.00 __fentry__ [5]
    -----------------------------------------------
    0.16 0.00 42075132/3644910704 sampler(Vector, Vector) [2]
    0.17 0.00 42825342/3644910704 Vector::operator!() [10]
    13.79 0.00 3560010230/3644910704 tracer(Vector, Vector, double&, Vector&) [3]
    [6] 10.2 14.12 0.00 3644910704 Vector::operator%(Vector) [6]
    -----------------------------------------------
    0.14 0.08 48538347/1941229839 sampler(Vector, Vector) [2]
    0.29 0.18 100663298/1941229839 main [1]
    5.20 3.12 1792028194/1941229839 tracer(Vector, Vector, double&, Vector&) [3]
    [7] 6.5 5.63 3.38 1941229839 Vector::operator+(Vector) [7]
    3.38 0.00 1941229839/4065901530 Vector::Vector(double, double, double) [8]
    -----------------------------------------------
    0.00 0.00 2/4065901530 Vector::operator^(Vector) [16]
    0.03 0.00 17039362/4065901530 main [1]
    0.06 0.00 37265475/4065901530 sampler(Vector, Vector) [2]
    0.49 0.00 278720760/4065901530 Vector::operator*(double) [9]
    3.12 0.00 1791646092/4065901530 tracer(Vector, Vector, double&, Vector&) [3]
    3.38 0.00 1941229839/4065901530 Vector::operator+(Vector) [7]
    [8] 5.1 7.08 0.00 4065901530 Vector::Vector(double, double, double) [8]
    -----------------------------------------------
    0.02 0.02 12023079/278720760 tracer(Vector, Vector, double&, Vector&) [3]
    0.09 0.07 42825342/278720760 Vector::operator!() [10]
    0.15 0.13 72877392/278720760 sampler(Vector, Vector) [2]
    0.31 0.26 150994947/278720760 main [1]
    [9] 0.8 0.57 0.49 278720760 Vector::operator*(double) [9]
    0.49 0.00 278720760/4065901530 Vector::Vector(double, double, double) [8]
    -----------------------------------------------
    0.10 0.09 12023079/42825342 tracer(Vector, Vector, double&, Vector&) [3]
    0.12 0.11 14025044/42825342 sampler(Vector, Vector) [2]
    0.14 0.13 16777219/42825342 main [1]
    [10] 0.5 0.37 0.33 42825342 Vector::operator!() [10]
    0.17 0.00 42825342/3644910704 Vector::operator%(Vector) [6]
    0.09 0.07 42825342/278720760 Vector::operator*(double) [9]
    -----------------------------------------------
    0.19 0.00 28050088/95158952 sampler(Vector, Vector) [2]
    0.47 0.00 67108864/95158952 main [1]
    [11] 0.5 0.66 0.00 95158952 Random() [11]
    -----------------------------------------------
    0.02 0.00 23240431/23240431 sampler(Vector, Vector) [2]
    [12] 0.0 0.02 0.00 23240431 Vector::Vector() [12]
    -----------------------------------------------
    <spontaneous>
    [13] 0.0 0.01 0.00 pow [13]
    -----------------------------------------------
    <spontaneous>
    [14] 0.0 0.01 0.00 rand [14]
    -----------------------------------------------
    <spontaneous>
    [15] 0.0 0.01 0.00 sqrt [15]
    -----------------------------------------------
    0.00 0.00 2/2 main [1]
    [16] 0.0 0.00 0.00 2 Vector::operator^(Vector) [16]
    0.00 0.00 2/4065901530 Vector::Vector(double, double, double) [8]
    -----------------------------------------------

    This table describes the call tree of the program, and was sorted by
    the total amount of time spent in each function and its children.

    Each entry in this table consists of several lines. The line with the
    index number at the left hand margin lists the current function.
    The lines above it list the functions that called this function,
    and the lines below it list the functions this one called.
    This line lists:
    index A unique number given to each element of the table.
    Index numbers are sorted numerically.
    The index number is printed next to every function name so
    it is easier to look up where the function is in the table.

    % time This is the percentage of the `total' time that was spent
    in this function and its children. Note that due to
    different viewpoints, functions excluded by options, etc,
    these numbers will NOT add up to 100%.

    self This is the total amount of time spent in this function.

    children This is the total amount of time propagated into this
    function by its children.

    called This is the number of times the function was called.
    If the function called itself recursively, the number
    only includes non-recursive calls, and is followed by
    a `+' and the number of recursive calls.

    name The name of the current function. The index number is
    printed after it. If the function is a member of a
    cycle, the cycle number is printed between the
    function's name and the index number.


    For the function's parents, the fields have the following meanings:

    self This is the amount of time that was propagated directly
    from the function into this parent.

    children This is the amount of time that was propagated from
    the function's children into this parent.

    called This is the number of times this parent called the
    function `/' the total number of times the function
    was called. Recursive calls to the function are not
    included in the number after the `/'.

    name This is the name of the parent. The parent's index
    number is printed after it. If the parent is a
    member of a cycle, the cycle number is printed between
    the name and the index number.

    If the parents of the function cannot be determined, the word
    `<spontaneous>' is printed in the `name' field, and all the other
    fields are blank.

    For the function's children, the fields have the following meanings:

    self This is the amount of time that was propagated directly
    from the child into the function.

    children This is the amount of time that was propagated from the
    child's children to the function.

    called This is the number of times the function called
    this child `/' the total number of times the child
    was called. Recursive calls by the child are not
    listed in the number after the `/'.

    name This is the name of the child. The child's index
    number is printed after it. If the child is a
    member of a cycle, the cycle number is printed
    between the name and the index number.

    If there are any cycles (circles) in the call graph, there is an
    entry for the cycle-as-a-whole. This entry shows who called the
    cycle (as parents) and the members of the cycle (as children.)
    The `+' recursive calls entry shows the number of function calls that
    were internal to the cycle, and the calls entry for each member shows,
    for that member, how many times it was called from other members of
    the cycle.

    Copyright (C) 2012-2014 Free Software Foundation, Inc.

    Copying and distribution of this file, with or without modification,
    are permitted in any medium without royalty provided the copyright
    notice and this notice are preserved.

    Index by function name

    [11] Random() [9] Vector::operator*(double) [1] main
    [3] tracer(Vector, Vector, double&, Vector&) [10] Vector::operator!() [13] pow
    [2] sampler(Vector, Vector) [7] Vector::operator+(Vector) [14] rand
    [8] Vector::Vector(double, double, double) [6] Vector::operator%(Vector) [15] sqrt
    [12] Vector::Vector() [5] __fentry__
    [16] Vector::operator^(Vector) [4] _mcount_private
    6 сен 15, 10:29    [18114550]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5 6 7 8 9 10 .. 41   вперед  Ctrl
    Все форумы / Программирование Ответить