Re[25]: Внимание, Java!
От: Eugeny__ Украина  
Дата: 19.07.10 10:12
Оценка:
Здравствуйте, CreatorCray, Вы писали:


E__>>В принципе, java вообще может ставиться простым копирпованием(и отлично работать)

CC>Где взять Java.rar который достаточно тупо распаковать в папку и чтоб больше нигде и ничего?

Тебе под какую платформу? Виндовс, как я понимаю, но 32 или 64? Запакую, выложу.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[26]: Внимание, Java!
От: CreatorCray  
Дата: 19.07.10 10:16
Оценка:
Здравствуйте, Eugeny__, Вы писали:

E__>>>В принципе, java вообще может ставиться простым копирпованием(и отлично работать)

CC>>Где взять Java.rar который достаточно тупо распаковать в папку и чтоб больше нигде и ничего?

E__>Тебе под какую платформу? Виндовс, как я понимаю, но 32 или 64? Запакую, выложу.

Пофигу в общем то. Есть и та и та.
Но удобнее наверное всё таки под 32
Thanks, панимаш, in advance
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[27]: Внимание, Java!
От: Eugeny__ Украина  
Дата: 19.07.10 13:45
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Здравствуйте, Eugeny__, Вы писали:


E__>>>>В принципе, java вообще может ставиться простым копирпованием(и отлично работать)

CC>>>Где взять Java.rar который достаточно тупо распаковать в папку и чтоб больше нигде и ничего?

E__>>Тебе под какую платформу? Виндовс, как я понимаю, но 32 или 64? Запакую, выложу.

CC>Пофигу в общем то. Есть и та и та.
CC>Но удобнее наверное всё таки под 32
CC>Thanks, панимаш, in advance

http://89.252.61.184/jdk.rar

Только учти, что это моя домашняя машина, потому кабель могут перевтыкнуть в ноут, и ресурс будет недоступен. А так — с пылу, с жару, свеженькая jdk для win32.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[3]: Внимание, Java!
От: lxa http://aliakseis.livejournal.com
Дата: 19.07.10 16:45
Оценка:
Смысла в таких тестах...

У меня например с таким кодом (чуть подправил):

#include <list>
#include <string>
#include <stdio.h>
#include <time.h>

#include <boost/pool/pool_alloc.hpp>
#include <boost/variant.hpp>

typedef boost::variant<const char*, std::string> Variant;

class foo
{
public:
    foo(int x, int y)
        : m_s("test")
        , m_f("test")
        , m_o("test")
        , m_i("test")
        , m_r("test")
        , m_b("test")
        , m_a("test")
    {
        m_x = x;
        m_y = y;
    }

private:
    int m_x;
    int m_y;
    Variant m_s;
    Variant m_f;
    Variant m_o;
    Variant m_i;
    Variant m_r;
    Variant m_b;
    Variant m_a;
};

int main ()
{
    std::list<foo, boost::fast_pool_allocator<foo> > lst;

    clock_t start = clock();

    for (int i=0;i<800000;i++)
        lst.push_back (foo(i,i));

    int ticks = (clock() - start) * 1000l / CLOCKS_PER_SEC;

    printf("%i, %i\n", ticks, lst.size());
}


получается на 800000 элементов (Пентиум 4 3 ГГц):
Java 1.5 688, 800000
VC++ 2005 546, 800000

Если свой аллокатор прикрутить, сишная программа чуть быстрее работает.

Disclaimer: В каждой шутке есть доля шутки.
Re[28]: Внимание, Java!
От: CreatorCray  
Дата: 19.07.10 20:21
Оценка:
Здравствуйте, Eugeny__, Вы писали:

E__>http://89.252.61.184/jdk.rar

E__>Только учти, что это моя домашняя машина, потому кабель могут перевтыкнуть в ноут, и ресурс будет недоступен. А так — с пылу, с жару, свеженькая jdk для win32.
Ага, пасиба, стянул.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[20]: Внимание, Java!
От: CreatorCray  
Дата: 19.07.10 20:21
Оценка:
Здравствуйте, Cyberax, Вы писали:

У меня как то совсем некузяво выглядит. Это "хвост", т.е. последние значения, которые выдал запуск: .\jdk1.6.0_21\bin\java.exe -cp . Foo

16, 80000
0, 80000
0, 80000
15, 80000
32, 80000
0, 80000
15, 80000
32, 80000
0, 80000
15, 80000
31, 80000
0, 80000
16, 80000
0, 80000
15, 80000

Точности таймера не хватает для правильного замера. Да и бросает как то очень сильно.
Есть какой либо более точный жабатаймер?

Далее:
C>Код:
C>
...
C>        m_s = "test";
C>        m_f = "test";
C>        m_o = "test";
C>        m_i = "test";
C>        m_r = "test";
C>        m_b = "test";
C>        m_a = "test";
...
C>


А нет ли на этом этапе существенной разницы с С++ тестом?
std::string то на каждую строку честно хранит отдельную копию содержимого. Нет ли тут со стороны Java меньшего колва аллокаций?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[20]: Внимание, Java!
От: CreatorCray  
Дата: 19.07.10 21:40
Оценка:
Здравствуйте, Cyberax, Вы писали:

Твой пример кода на Java функционально не эквивалентен С++ варианту. Ибо std строки в С++ суть массивы, которые при копировании как ни странно честно копируются. А в Java строки суть иммутабельные объекты, при копировании которых реального выделения памяти не происходит.
Что с точки зрения замера скорости аллокаций нам не подходит в принципе.

Почему бы не сравнивать вот такой вариант:
import java.util.ArrayList;

public class Foo {
 
    int m_x;
    int m_y;

    char[] m_s;
    char[] m_f;
    char[] m_o;
    char[] m_i;
    char[] m_r;
    char[] m_b;
    char[] m_a;

    static char[] value = "This is a test for Allocations".toCharArray();
 
    public Foo(int x, int y) {
        m_x = x;
        m_y = y;

        m_s = new char[value.length]; System.arraycopy(value, 0, m_s, 0, value.length);
        m_f = new char[value.length]; System.arraycopy(value, 0, m_f, 0, value.length);
        m_o = new char[value.length]; System.arraycopy(value, 0, m_o, 0, value.length);
        m_i = new char[value.length]; System.arraycopy(value, 0, m_i, 0, value.length);
        m_r = new char[value.length]; System.arraycopy(value, 0, m_r, 0, value.length);
        m_b = new char[value.length]; System.arraycopy(value, 0, m_b, 0, value.length);
        m_a = new char[value.length]; System.arraycopy(value, 0, m_a, 0, value.length);
    }
 
    public static void test() {
        ArrayList<Foo> list = new ArrayList<Foo>();
        long time = System.currentTimeMillis();
        for(int i = 0; i < 80000; i++) {
            list.add(new Foo(i, i));
        }

        System.out.println("" + (System.currentTimeMillis() - time) + ", " +  list.size());
    }
 
    public static void main(String[] args) {
        for(int f=0;f<30;++f)
            test();
    }
}


#include <list>
#include <string>
#include <stdio.h>

// эти defines для быстрой смены типа контейнера строк (замерял скорость работы wstring, immutable refcounted строк и ещё парой реализаций)
#define STRING    std::string
#define VALUE    value
static STRING VALUE ("This is a test for Allocations");

class foo
{
public:
    foo(int x, int y)
    {
        m_x = x;
        m_y = y;
        m_s = VALUE;
        m_f = VALUE;
        m_o = VALUE;
        m_i = VALUE;
        m_r = VALUE;
        m_b = VALUE;
        m_a = VALUE;
    }

private:
    int m_x;
    int m_y;
    STRING m_s;
    STRING m_f;
    STRING m_o;
    STRING m_i;
    STRING m_r;
    STRING m_b;
    STRING m_a;
};

void test ()
{
    std::list<foo> lst;

    Duration timer;    // Замерялка через RDTSC, более точная
    timer.Start ();

    for (int i=0;i<80000;i++)
        lst.push_back (foo(i,i));

    timer.End ();

    printf("%f, %i\n", timer.GetSeconds ()*1000.0, lst.size());
}

int main()
{
    for (int i=0;i<30;i++)
        test ();
}


Строка специально выбрана подлиннее чтоб убрать воздействие буфера для маленьких строк в std::string и заставить всегда использовать аллокатор.

С таким вариантом у меня вышло:

.\jdk1.6.0_21\bin\java.exe -cp . Foo

203, 80000
219, 80000
156, 80000
125, 80000
203, 80000
156, 80000
156, 80000
157, 80000
203, 80000
203, 80000
156, 80000
141, 80000
140, 80000
266, 80000
250, 80000
219, 80000
234, 80000
63, 80000
187, 80000
219, 80000
234, 80000
63, 80000
187, 80000
219, 80000
250, 80000
78, 80000
125, 80000
250, 80000
78, 80000
157, 80000

CPU stats:
Kernel time : [0:00:00.1562500], [0.156250 secs]
User time : [0:00:05.3281250], [5.328125 secs]
Total time : [0:00:05.4843750], [5.484375 secs]
Memory stats:
Page faults count : [ 125'562]
Peak pagefile usage : [146'571'264] bytes
Peak virtual size : [425'680'896] bytes
Peak working set size : [136'761'344] bytes


.\jdk1.6.0_21\bin\java.exe -Xmx64M -cp . Foo

187, 80000
172, 80000
94, 80000
156, 80000
125, 80000
125, 80000
125, 80000
109, 80000
125, 80000
125, 80000
110, 80000
125, 80000
109, 80000
109, 80000
219, 80000
110, 80000
109, 80000
109, 80000
203, 80000
110, 80000
109, 80000
125, 80000
219, 80000
125, 80000
109, 80000
219, 80000
109, 80000
110, 80000
109, 80000
219, 80000

CPU stats:
Kernel time : [0:00:00.0625000], [0.062500 secs]
User time : [0:00:04.4531250], [4.453125 secs]
Total time : [0:00:04.5156250], [4.515625 secs]
Memory stats:
Page faults count : [ 53'312]
Peak pagefile usage : [ 91'447'296] bytes
Peak virtual size : [223'698'944] bytes
Peak working set size : [ 80'998'400] bytes


.\jdk1.6.0_21\bin\java.exe -Xincgc -Xmx64M -cp . Foo

187, 80000
204, 80000
281, 80000
234, 80000
203, 80000
235, 80000
218, 80000
204, 80000
218, 80000
203, 80000
188, 80000
265, 80000
219, 80000
187, 80000
266, 80000
219, 80000
234, 80000
219, 80000
203, 80000
234, 80000
219, 80000
203, 80000
219, 80000
219, 80000
203, 80000
234, 80000
203, 80000
204, 80000
265, 80000
219, 80000
CPU stats:
Kernel time : [0:00:00.0312500], [0.031250 secs]
User time : [0:00:09.0937500], [9.093750 secs]
Total time : [0:00:09.1250000], [9.125000 secs]
Memory stats:
Page faults count : [ 22'225]
Peak pagefile usage : [ 92'123'136] bytes
Peak virtual size : [201'547'776] bytes
Peak working set size : [ 76'644'352] bytes


и C++

стандартный аллокатор:

210.068433, 80000
206.174787, 80000
207.241701, 80000
206.183641, 80000
208.581982, 80000
205.540379, 80000
208.170741, 80000
205.965906, 80000
207.186541, 80000
205.901459, 80000
207.426433, 80000
208.312690, 80000
207.108556, 80000
206.281689, 80000
206.834430, 80000
207.678556, 80000
206.750673, 80000
205.897863, 80000
207.470215, 80000
208.759731, 80000
205.934526, 80000
207.474938, 80000
205.973119, 80000
208.846007, 80000
205.916808, 80000
208.025191, 80000
206.046655, 80000
207.433526, 80000
206.204102, 80000
207.539007, 80000

CPU stats:
Kernel time : [0:00:00.2968750], [0.296875 secs]
User time : [0:00:08.6875000], [8.687500 secs]
Total time : [0:00:08.9843750], [8.984375 secs]
Memory stats:
Page faults count : [ 263'150]
Peak pagefile usage : [41'246'720] bytes
Peak virtual size : [72'245'248] bytes
Peak working set size : [42'008'576] bytes


ThreadPoolAlloc

114.062361, 80000
92.065219, 80000
71.119285, 80000
90.830133, 80000
70.827027, 80000
95.185398, 80000
70.785824, 80000
90.512021, 80000
70.936328, 80000
90.846240, 80000
70.623603, 80000
90.786686, 80000
70.830254, 80000
92.060117, 80000
73.383081, 80000
90.787868, 80000
70.517385, 80000
91.192131, 80000
71.300022, 80000
91.120346, 80000
70.735668, 80000
90.928595, 80000
71.169750, 80000
90.597888, 80000
70.664960, 80000
90.950428, 80000
70.866458, 80000
91.388242, 80000
70.847812, 80000
90.680832, 80000

CPU stats:
Kernel time : [0:00:00.0000000], [0.000000 secs]
User time : [0:00:03.8906250], [3.890625 secs]
Total time : [0:00:03.8906250], [3.890625 secs]
Memory stats:
Page faults count : [ 14'030]
Peak pagefile usage : [57'163'776] bytes
Peak virtual size : [62'955'520] bytes
Peak working set size : [57'552'896] bytes


Поправь если что где не так у меня с жабьим кодом.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[21]: Внимание, Java!
От: Cyberax Марс  
Дата: 19.07.10 23:28
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Точности таймера не хватает для правильного замера. Да и бросает как то очень сильно.

CC>Есть какой либо более точный жабатаймер?
System.nanoTime() в наносекундах. В Линуксе, кстати, и System.currentTimeMillis() вполне с хорошей точностью.

CC>А нет ли на этом этапе существенной разницы с С++ тестом?

CC>std::string то на каждую строку честно хранит отдельную копию содержимого. Нет ли тут со стороны Java меньшего колва аллокаций?
Будет.
Sapienti sat!
Re[21]: Внимание, Java!
От: Cyberax Марс  
Дата: 19.07.10 23:34
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Твой пример кода на Java функционально не эквивалентен С++ варианту. Ибо std строки в С++ суть массивы, которые при копировании как ни странно честно копируются. А в Java строки суть иммутабельные объекты, при копировании которых реального выделения памяти не происходит.

CC>Что с точки зрения замера скорости аллокаций нам не подходит в принципе.
CC>Почему бы не сравнивать вот такой вариант:
Ок. Хотя arraycopy можно убрать — массивы в Java зануляются автоматически. Впрочем, пофиг, оно не влияет почти.

Зато очень сильно влияют настройки GC:
cyberax@devsrv:~/some/test2$ /home/cyberax/jdks/jdk1.7.0/bin/java -server -XX:+UseParallelGC -cp . Foo
268, 80000
294, 80000
261, 80000
27, 80000
91, 80000
28, 80000
48, 80000
32, 80000
71, 80000
29, 80000
82, 80000
29, 80000
29, 80000
120, 80000
27, 80000
28, 80000
27, 80000
45, 80000
30, 80000
28, 80000
25, 80000
61, 80000
28, 80000
28, 80000
25, 80000
71, 80000
29, 80000
29, 80000
25, 80000
26, 80000
cyberax@devsrv:~/some/test2$ /home/cyberax/jdks/jdk1.7.0/bin/java -Xincgc -cp . Foo
231, 80000
245, 80000
403, 80000
226, 80000
368, 80000
233, 80000
397, 80000
160, 80000
376, 80000
222, 80000
404, 80000
231, 80000
454, 80000
229, 80000
305, 80000
223, 80000
402, 80000
226, 80000
445, 80000
225, 80000
359, 80000
227, 80000
317, 80000
236, 80000
418, 80000
234, 80000
411, 80000
283, 80000
362, 80000
171, 80000

У тебя, скорее всего, как раз инкрементальный GC врубился.

Потом я запустил С++ и чуть со стула не упал:
cyberax@devsrv:~/some/test2$ ./a.out 
40000.000000, 80000
36000.000000, 80000
37000.000000, 80000
37000.000000, 80000
36000.000000, 80000
37000.000000, 80000
37000.000000, 80000
37000.000000, 80000
36000.000000, 80000
37000.000000, 80000
37000.000000, 80000
37000.000000, 80000
36000.000000, 80000
37000.000000, 80000
37000.000000, 80000
37000.000000, 80000
37000.000000, 80000
37000.000000, 80000
37000.000000, 80000
36000.000000, 80000
37000.000000, 80000
37000.000000, 80000
37000.000000, 80000
37000.000000, 80000
36000.000000, 80000
36000.000000, 80000
37000.000000, 80000
37000.000000, 80000
37000.000000, 80000
37000.000000, 80000

Как так! С++ быстрее Java, не может быть!

Но ничего, пара твиков и всё в порядке. В libstdc++ строки — со счётчиком ссылок, так что аллокаций не происходит.

Лёгким движением ноги:
#include <list>
#include <string>
#include <vector>
#include <stdio.h>
#include <sys/time.h>

// эти defines для быстрой смены типа контейнера строк (замерял скорость работы wstring, immutable refcounted строк и ещё парой реализаций)
//#define STRING    std::string
#define STRING std::vector<unsigned char>
#define VALUE    value

const char initval[]="This is a test for Allocations";
static STRING VALUE (initval, initval+sizeof(initval));

class foo
{
public:
    foo(int x, int y)
    {
        m_x = x;
        m_y = y;
        m_s = VALUE;
        m_f = VALUE;
        m_o = VALUE;
        m_i = VALUE;
        m_r = VALUE;
        m_b = VALUE;
        m_a = VALUE;
    }

private:
    int m_x;
    int m_y;
    STRING m_s;
    STRING m_f;
    STRING m_o;
    STRING m_i;
    STRING m_r;
    STRING m_b;
    STRING m_a;
};

unsigned long GetTickCount()
{
    struct timeval tv;
    gettimeofday(&tv,NULL);
    return (tv.tv_sec*1000+tv.tv_usec/1000);
}

void test ()
{
    std::list<foo> lst;

//    Duration timer;    // Замерялка через RDTSC, более точная
//    timer.Start ();
    long time1=GetTickCount();

    for (int i=0;i<80000;i++)
        lst.push_back (foo(i,i));

//    timer.End ();

    printf("%f, %i\n", (GetTickCount ()-time1)*1000.0, lst.size());
}

int main()
{
    for (int i=0;i<30;i++)
        test ();
}


cyberax@devsrv:~/some/test2$ ./a.out 
366000.000000, 80000
392000.000000, 80000
379000.000000, 80000
404000.000000, 80000
378000.000000, 80000
384000.000000, 80000
379000.000000, 80000
391000.000000, 80000
379000.000000, 80000
391000.000000, 80000
378000.000000, 80000
394000.000000, 80000
378000.000000, 80000
337000.000000, 80000
379000.000000, 80000
392000.000000, 80000
379000.000000, 80000
392000.000000, 80000
379000.000000, 80000
386000.000000, 80000
379000.000000, 80000
395000.000000, 80000
377000.000000, 80000
394000.000000, 80000
375000.000000, 80000
389000.000000, 80000
375000.000000, 80000
392000.000000, 80000
375000.000000, 80000
387000.000000, 80000


Чудес не бывает.
Sapienti sat!
Re[11]: Внимание, Java!
От: Воронков Василий Россия  
Дата: 19.07.10 23:36
Оценка:
Здравствуйте, legogogo, Вы писали:

L>Расскажи тогда, как сборщик мусора в Java узнаёт какие объекты нужно удалят если подсчёт ссылок на эти объекты он не ведёт?

L>Чёрная магия?

Подсчет ссылок — лишь один из вариантов реализации сборки мусора, причем самый примитивный. Настолько примитивный, что некоторые даже не считают это полноценной сборкой мусора, т.к. невозможно разрулить циклические ссылки, что будет приводить к утечкам памяти.
Наиболее прогрессивный вариант GC — это, к примеру, алгоритм mark and sweep. Епт, даже в ДжаваСкрипте не используется подсчет ссылок.
Re[3]: Внимание, Java!
От: Воронков Василий Россия  
Дата: 19.07.10 23:42
Оценка:
Здравствуйте, Eugeny__, Вы писали:

Жесть. Что ж ты сравниваешь, интересно? Зачем в варианте на С++ std::list?
Re[12]: Внимание, Java!
От: Cyberax Марс  
Дата: 20.07.10 00:59
Оценка: 2 (1)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Наиболее прогрессивный вариант GC — это, к примеру, алгоритм mark and sweep. Епт, даже в ДжаваСкрипте не используется подсчет ссылок.



Наиболее прогрессивный вариант — это G1GC ( http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.63.6386&amp;rep=rep1&amp;type=pdf )
Sapienti sat!
Re[22]: Внимание, Java!
От: CreatorCray  
Дата: 20.07.10 06:23
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Зато очень сильно влияют настройки GC:

Ну ок, возьмём твой мегачит:
.\jdk1.6.0_21\bin\java.exe -server -XX:+UseParallelGC -cp . Foo

254.916247, 80000
178.487874, 80000
253.907226, 80000
64.608002, 80000
55.652201, 80000
52.662291, 80000
66.389362, 80000
82.085302, 80000
24.399647, 80000
44.97572, 80000
78.197743, 80000
24.514156, 80000
58.451013, 80000
24.430983, 80000
41.011198, 80000
24.352938, 80000
25.927384, 80000
63.605615, 80000
24.475552, 80000
45.181642, 80000
24.534972, 80000
26.829139, 80000
60.779813, 80000
24.521908, 80000
42.095395, 80000
24.530861, 80000
25.554457, 80000
60.437792, 80000
24.704779, 80000
42.798067, 80000

CPU stats:
        Kernel time : [0:00:00.1562500], [0.156250 secs]
        User time   : [0:00:02.5625000], [2.562500 secs]
        Total time  : [0:00:02.7187500], [2.718750 secs]
Memory stats:
        Page faults count       : [      64'755]
        Peak pagefile usage     : [ 306'028'544] bytes
        Peak virtual size       : [ 687'284'224] bytes
        Peak working set size   : [ 256'815'104] bytes

Ёй! Потребление памяти больше в ~2 раза относительно incremental GC и в ~5.4 раза относительно С++
Работа GC выполняется во втором потоке, так что по сути тут мы читерим, пряча это время.

Test.exe, Pool alloc

76.618042, 80000
64.474669, 80000
40.385655, 80000
64.664595, 80000
40.183000, 80000
63.729369, 80000
40.442341, 80000
63.774342, 80000
40.519583, 80000
64.144611, 80000
40.702979, 80000
64.250410, 80000
41.216379, 80000
63.976524, 80000
40.634132, 80000
63.757263, 80000
40.796273, 80000
63.676170, 80000
40.176121, 80000
63.880232, 80000
40.351401, 80000
64.007670, 80000
40.518162, 80000
63.824414, 80000
40.520745, 80000
63.816103, 80000
40.824561, 80000
64.149085, 80000
40.563275, 80000
64.241910, 80000

CPU stats:
        Kernel time : [0:00:00.0312500], [0.031250 secs]
        User time   : [0:00:02.5781250], [2.578125 secs]
        Total time  : [0:00:02.6093750], [2.609375 secs]
Memory stats:
        Page faults count       : [      11'532]
        Peak pagefile usage     : [  46'608'384] bytes
        Peak virtual size       : [  52'416'512] bytes
        Peak working set size   : [  47'312'896] bytes

Ну? Где те самые 10х, о наличии которых нам столько твердили большевики?

На С++ кстати ещё можно выпендриться и применить зону со сбросом в конце каждого цикла, получим вообще что то реактивное.

34.524676, 80000
26.542436, 80000
26.090626, 80000
26.232086, 80000
26.091688, 80000
26.154474, 80000
26.387368, 80000
26.162979, 80000
26.172048, 80000
26.102577, 80000
26.067046, 80000
25.986617, 80000
26.188399, 80000
26.168366, 80000
26.228803, 80000
26.002858, 80000
26.206242, 80000
25.960738, 80000
26.119707, 80000
25.891841, 80000
26.017454, 80000
26.183376, 80000
26.226369, 80000
26.171110, 80000
26.190429, 80000
26.045916, 80000
26.384445, 80000
26.117612, 80000
26.043851, 80000
26.126067, 80000

CPU stats:
        Kernel time : [0:00:00.0000000], [0.000000 secs]
        User time   : [0:00:00.7968750], [0.796875 secs]
        Total time  : [0:00:00.7968750], [0.796875 secs]
Memory stats:
        Page faults count       : [      10'416]
        Peak pagefile usage     : [  42'315'776] bytes
        Peak virtual size       : [  48'046'080] bytes
        Peak working set size   : [  42'733'568] bytes

Но поскольку это не generic аллокатор то рассматривать его не будем. По крайней мере до тех пор пока меня не вштырит написать на его основе полноценный generic аллокатор.

C>Чудес не бывает.

Ага. Именно поэтому жаба так и не показала обещаного 10х.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[23]: Внимание, Java!
От: Cyberax Марс  
Дата: 20.07.10 07:51
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Ёй! Потребление памяти больше в ~2 раза относительно incremental GC и в ~5.4 раза относительно С++

Где-то раза в 2.5 в реальности больше будет занимать. Тут очень сильный оверхед на заголовки объектов и т.п.

CC>Работа GC выполняется во втором потоке, так что по сути тут мы читерим, пряча это время.

Нет, это параллельный GC, а не конкурентный. Он останавливает программу на время сборки мусора, но выполняет сборку в несколько потоков одновременно. Конкурентный GC здесь показывает очень плохие результаты — он не справляется с таким потоком мусора.

CC>Ну? Где те самые 10х, о наличии которых нам столько твердили большевики?

CC>Но поскольку это не generic аллокатор то рассматривать его не будем. По крайней мере до тех пор пока меня не вштырит написать на его основе полноценный generic аллокатор.
ThreadPool — это будет не generic-аллокатор. Объекты из него не разделяются между потоками, нельзя освободить их из другого потока и т.п. В Java у нас полностью общий аллокатор.

Кроме того, общий аллокатор из чего-то типа ThreadPool'а быстрым сделать невозможно из-за необходимости межпоточной синхронизации в том или ином виде. В Java её нет вообще на этапе выделения.

Это всё, кстати, скорость создания объектов в Java реально отражается на практике. Скажем, компиляторы на Java можно писать более быстрые, чем на С++. Как раз из-за того, что манипуляции со сложными деревьями объектов можно делать быстро и потокобезопасно.

C>>Чудес не бывает.

CC>Ага. Именно поэтому жаба так и не показала обещаного 10х.
Так ведь показала, по сравнению с обычным аллокатором.
Sapienti sat!
Re[24]: Внимание, Java!
От: CreatorCray  
Дата: 20.07.10 09:19
Оценка:
Здравствуйте, Cyberax, Вы писали:

CC>>Ну? Где те самые 10х, о наличии которых нам столько твердили большевики?

CC>>Но поскольку это не generic аллокатор то рассматривать его не будем. По крайней мере до тех пор пока меня не вштырит написать на его основе полноценный generic аллокатор.
C>ThreadPool — это будет не generic-аллокатор.
Почему это вдруг? Очень даже аллокатор генерала пурпоса

C> Объекты из него не разделяются между потоками

Нет. Выделил в одном потоке — юзай в любом. Или ты под разделением между потоками что то другое имел в виду?

C> нельзя освободить их из другого потока

Можно. В чём проблема то?

C>Кроме того, общий аллокатор из чего-то типа ThreadPool'а быстрым сделать невозможно из-за необходимости межпоточной синхронизации в том или ином виде.

Камрад, ты меня такими заявлениями как минимум удивляешь.
ThreadPool не нуждается в межпоточной синхронизации by design. Каждый поток имеет свой собственный пул, из которого выделяется память, запрошенная этим потоком.
Освобождение памяти, выделенной другим потоком осуществляется путём добавления освобождаемого блока в interlocked single linked list, который родной поток при обращению к аллокатору забирает одним CAS и у себя уже их освобождает обычным путём.

C>Это всё, кстати, скорость создания объектов в Java реально отражается на практике. Скажем, компиляторы на Java можно писать более быстрые, чем на С++. Как раз из-за того, что манипуляции со сложными деревьями объектов можно делать быстро и потокобезопасно.

Ахха. Помниццо как то я встраивал жаббу в одну прогу в качестве скриптового языка (дёргал написанные на жаббе классы через JNI). Так вот был выбор или родной SUN компилер, написанный на жаббе или native jvc.exe из комплекта MSJava. Микрософтовский компилер порвал в брызги жабий как по скорости работы так и по потребляемым ресурсам.
Если использовать хреново подходящие примитивы то что на жабе что на С++ производительность будет хреновой.

C>>>Чудес не бывает.

CC>>Ага. Именно поэтому жаба так и не показала обещаного 10х.
C>Так ведь показала, по сравнению с обычным аллокатором.
Ещё раз:
стандартный GC в сравнении со стандартным WinHeap:

.\jdk1.6.0_21\bin\java.exe -cp . Foo

178.965672, 80000
170.895065, 80000
299.33923, 80000
156.160832, 80000
270.661499, 80000
390.741777, 80000
241.630051, 80000
150.34963, 80000
263.046743, 80000
155.360559, 80000
263.771127, 80000
378.209187, 80000
153.222916, 80000
161.026919, 80000
376.424778, 80000
153.060679, 80000
200.610458, 80000
332.77648, 80000
155.180045, 80000
222.258741, 80000
330.846635, 80000
153.156987, 80000
197.673149, 80000
154.96497, 80000
266.555019, 80000
386.60875, 80000
239.822641, 80000
150.176689, 80000
274.867374, 80000
156.477593, 80000

CPU stats:
        Kernel time : [0:00:00.1093750], [0.109375 secs]
        User time   : [0:00:10.1562500], [10.156250 secs]
        Total time  : [0:00:10.2656250], [10.265625 secs]
Memory stats:
        Page faults count       : [      32'573]
        Peak pagefile usage     : [ 128'598'016] bytes
        Peak virtual size       : [ 241'696'768] bytes
        Peak working set size   : [ 114'872'320] bytes


198.442401, 80000
197.791362, 80000
199.514607, 80000
198.151045, 80000
197.788509, 80000
198.879575, 80000
197.641691, 80000
198.525993, 80000
198.143768, 80000
198.203117, 80000
197.372908, 80000
198.163047, 80000
198.154402, 80000
197.863302, 80000
197.491951, 80000
197.366688, 80000
197.892089, 80000
198.403577, 80000
197.534291, 80000
199.362906, 80000
197.456260, 80000
198.507332, 80000
198.091297, 80000
197.902075, 80000
197.782648, 80000
198.400924, 80000
197.833812, 80000
197.770896, 80000
198.211268, 80000
198.054813, 80000

CPU stats:
        Kernel time : [0:00:00.4218750], [0.421875 secs]
        User time   : [0:00:08.1093750], [8.109375 secs]
        Total time  : [0:00:08.5312500], [8.531250 secs]
Memory stats:
        Page faults count       : [     212'163]
        Peak pagefile usage     : [  32'120'832] bytes
        Peak virtual size       : [  72'232'960] bytes
        Peak working set size   : [  32'878'592] bytes


Где 10х?
У стандартного минимум — 197 мс. У жаббы — 150. Это 1.31х
Или ты предлагаешь сравнивать затюненую вручную (-server -XX:+UseParallelGC) жабу с default mode WinHeap?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[25]: Внимание, Java!
От: Cyberax Марс  
Дата: 20.07.10 10:03
Оценка:
Здравствуйте, CreatorCray, Вы писали:

C>>ThreadPool — это будет не generic-аллокатор.

CC>Почему это вдруг? Очень даже аллокатор генерала пурпоса
Не особо.

C>> Объекты из него не разделяются между потоками

CC>Нет. Выделил в одном потоке — юзай в любом. Или ты под разделением между потоками что то другое имел в виду?
Выделил в одном, уничтожил в другом, помутировав немного. Или чтобы объект в одном потоке пережил срок жизни пула объектов в другом потоке.

C>> нельзя освободить их из другого потока

CC>Можно. В чём проблема то?
Intelocked-операции всю скорость съедят. В моём тесте с С++ один только interlocked exchange на refcounter'е в std::string уже тормозит больше, чем код на Java.

Кроме того, в С++ refcounted-объекты тоже постоянно приходится использовать, а уж там полные тормоза по сравнению с GC в многопоточных программах.

C>>Это всё, кстати, скорость создания объектов в Java реально отражается на практике. Скажем, компиляторы на Java можно писать более быстрые, чем на С++. Как раз из-за того, что манипуляции со сложными деревьями объектов можно делать быстро и потокобезопасно.

CC>Ахха. Помниццо как то я встраивал жаббу в одну прогу в качестве скриптового языка (дёргал написанные на жаббе классы через JNI). Так вот был выбор или родной SUN компилер, написанный на жаббе или native jvc.exe из комплекта MSJava. Микрософтовский компилер порвал в брызги жабий как по скорости работы так и по потребляемым ресурсам.
Ой, ну ты ещё Java 1 с интерпретатором вспомни. С тех пор много воды утекло.

Тогда ещё был Jikes — быстрый компилятор Java на С++. Где-то года четыре назад только Eclipse'овый компилятор стал работать в разы быстрее jikes'а.

CC>Где 10х?

С -XX:+UseParallelGC.

CC>У стандартного минимум — 197 мс. У жаббы — 150. Это 1.31х

CC>Или ты предлагаешь сравнивать затюненую вручную (-server -XX:+UseParallelGC) жабу с default mode WinHeap?
У меня, к примеру, -XX:+UseParallelGC включается автоматически (внутри JVM встроены эвристики по выбору механизма GC, которые не всегда адекватны). Тут особого тюнинга как бы и нет. Тюнинг — это подбор размеров поколений, tenured-объектов и т.п. Опять же, тест абсолютно искусственный на 100%, так что неудивительно, что стандартные настройки ведут себя неадекватно.

Вот из моего проекта настройки: "-Xms512m -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=25 -XX:NewSize=5m -XX:MaxNewSize=15m -XX:SurvivorRatio=6 -XX:TargetSurvivorRatio=80 -XX:-UseConcMarkSweepGC -XX:-CMSIncrementalMode -XX:+UseParallelOldGC -XX:+UseCompressedOops" — это вот уже тюнинг.

Я работал с Hoard — это самый быстрый аллокатор для многопоточных систем, так даже он тормознее Java. Причём современные GC масштабируются почти линейно с ростом процессоров, а вот аллокаторы умирают рано или поздно на блокировках.
Sapienti sat!
Re[5]: Внимание, Java!
От: пыщьх http://rsdn_user.livejournal.com
Дата: 20.07.10 10:09
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, Nik_1, Вы писали:


N_>>Производительность 99% кода неособо вожна, но когда в приложении вдруг возникнет проблема с перфомонсом, то этот 1% кода в плюсах можно оптимизировать и получить требуемый результат, а в жаве нет В плюсах и алокатор можно на свой очень быстрый свой поставить, и строки более умные использовать, и исбавиться лишнего копирования перейдя на указатели на обьекты — и будет этот код менее милисекунды работать. А вот в джаве если упрешся в перфоманс — ничего сделать с этим не сможешь.


I>И ради этого 1% тебе надо постоянно, чт бы ты не писал, думать о тысячах мелочей.

Почему? Ради этого 1% можно в 99% кода юзать std::string и не заморачиваться о тысячах мелочей. А в 1% написать свою string.

I>В джаве можно сосредоточиться на более высокоуровневой оптимизации.

И? В си плюс плюс тоже можно. А вот с низкоуровневой — в жабе нельзя.
Запретное обсуждение модерирования RSDN:
http://rsdn-user.livejournal.com/652.html
Re[6]: Внимание, Java!
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.07.10 10:32
Оценка: :)
Здравствуйте, пыщьх, Вы писали:

I>>И ради этого 1% тебе надо постоянно, чт бы ты не писал, думать о тысячах мелочей.

П>Почему? Ради этого 1% можно в 99% кода юзать std::string и не заморачиваться о тысячах мелочей. А в 1% написать свою string.

Кроме std::string приходится использовать и другие стринги.

I>>В джаве можно сосредоточиться на более высокоуровневой оптимизации.

П>И? В си плюс плюс тоже можно. А вот с низкоуровневой — в жабе нельзя.

Тоже можно Издержки разные, на порядок по времени например только из за медленной компиляции.
Re[26]: Внимание, Java!
От: CreatorCray  
Дата: 20.07.10 10:33
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>>> Объекты из него не разделяются между потоками

CC>>Нет. Выделил в одном потоке — юзай в любом. Или ты под разделением между потоками что то другое имел в виду?
C>Выделил в одном, уничтожил в другом, помутировав немного. Или чтобы объект в одном потоке пережил срок жизни пула объектов в другом потоке.
Это всё есть.

C>>> нельзя освободить их из другого потока

CC>>Можно. В чём проблема то?
C>Intelocked-операции всю скорость съедят. В моём тесте с С++ один только interlocked exchange на refcounter'е в std::string уже тормозит больше, чем код на Java.
Интерлокед там 1 на деаллокацию и только в случае деаллокации из не родного потока. Это довольно редкий сценарий.

CC>>Где 10х?

C>С -XX:+UseParallelGC.
Тогда я имею полное право использовать ThreadPoolAlloc. Так что всё равно нету 10х.

C>Причём современные GC масштабируются почти линейно с ростом процессоров,

Ты Hoard точно использовал? У них даже на сайте висят графики про его масштабирование на процессора.

C>а вот аллокаторы умирают рано или поздно на блокировках.

Да не используют уже давно блокировки. Те же Hoard, TBB.
Блокировки относятся к тому же периоду что и ранние GC.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[27]: Внимание, Java!
От: Cyberax Марс  
Дата: 20.07.10 10:46
Оценка:
Здравствуйте, CreatorCray, Вы писали:

C>>Intelocked-операции всю скорость съедят. В моём тесте с С++ один только interlocked exchange на refcounter'е в std::string уже тормозит больше, чем код на Java.

CC>Интерлокед там 1 на деаллокацию и только в случае деаллокации из не родного потока. Это довольно редкий сценарий.
Там их больше будет. Например, для возврата объекта в "родной" пул и т.п.

Получается очень и очень непростой дизайн аллокатора.

CC>>>Где 10х?

C>>С -XX:+UseParallelGC.
CC>Тогда я имею полное право использовать ThreadPoolAlloc. Так что всё равно нету 10х.
Так я ведь задизайню тест, где у тебя всё будет сливать моему

C>>Причём современные GC масштабируются почти линейно с ростом процессоров,

CC>Ты Hoard точно использовал? У них даже на сайте висят графики про его масштабирование на процессора.
Да, использовал. Графики — это конечно хорошо, но практика от теории слегка отличалась. У Hoard'а были паталогические случаи, когда он умирал при некоторых шаблонах использования, приходилось их обходить.

C>>а вот аллокаторы умирают рано или поздно на блокировках.

CC>Да не используют уже давно блокировки. Те же Hoard, TBB.
CC>Блокировки относятся к тому же периоду что и ранние GC.
Неа. Ты ну никак не можешь сделать многопоточный аллокатор без блокировок (sleeping mutexes) и/или атомарных операций. Java читит из-за того, что там не надо учитывать созданные объекты.
Sapienti sat!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.