Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Java > C++, Кого слушать? 
:(
    Опции темы
MAKCim
Дата 7.6.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



рассмотрим арифметику
Java
Код

// Test.java

public class Test {
    public static void main(String args[]) {
        long t = 0;
        for (long i = 0; i < 0x100; ++i)
            for (long j = 0; j < 0x100; ++j)
                for (long k = 0; k < 0x100; ++k)
                    t += ((i - j) * ((k % ((i * j) == 0 ? 47 : (i * j))) >> 3) - (i % (j == 0 ? 89 : j)) / ((k - i) == 0 ? 25 : (k - i))) - 1;
        System.exit((int)t);
    }
}

C
Код

/* Test.c */

#include <unistd.h>

int main() {
    long t = 0;
    for (long i = 0; i < 0x100; ++i)
        for (long j = 0; j < 0x100; ++j)
            for (long k = 0; k < 0x100; ++k)
                t += ((i - j) * ((k % ((i * j) == 0 ? 47 : (i * j))) >> 3) - (i % (j == 0 ? 89 : j)) / ((k - i) == 0 ? 25 : (k - i))) - 1;
    _exit((int)t);
}


Код

# javac Test.java
# time java -classpath /home/rei3er Test

real    0m1.809s
user    0m1.776s
sys     0m0.008s

# icc -O3 Test.c -o Test
# time ./Test

real    0m0.891s
user    0m0.888s
sys     0m0.000s

# gcc -O3 -std=c99 Test.c -o Test
# time ./Test

real    0m1.419s
user    0m1.420s
sys     0m0.000s

итого с простой арифметикой Java работает в 1.809 / 0.891 ~ 2.03 раза медленнее, чем код ICC
и в 1.809 / 1.419 ~ 1.27 раз медленнее, чем код GCC

Это сообщение отредактировал(а) MAKCim - 7.6.2008, 12:21


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
W4FhLF
Дата 7.6.2008, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



MAKCim, интересно, чего туда icc напихал, что аж почти в два раза обошёл gcc? 

PS Так вот, кто такой rei3er smile


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
3,14
Дата 7.6.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: 1
Всего: 24



MAKCim, тут нужно смотреть, ближайшие дня три, мне точно некогда будет :( Первое что приходит в голову: нужно проверить одинаковые ли диапозоны используются для java-кого long (жёстко прописан и не зависит от процессора) и c++ long (зависит от процессора).


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Мастер
Дата 7.6.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Цитата(Lazin @ 6.6.2008,  08:43)
джава все автоматически распаралеливать научилась?

А кто за тебя код писать будет?
В Java есть механизм запуска параллельных процессов. (Ищи по клюевому слову Thread.) Вот пример:
Код
import java.applet.*;

class Chew extends Thread {

    public void run() {
        for (int i=0; i<8; i++) {
            System.out.println("Chewing");
            try {
                Thread.sleep(400);
            } catch (InterruptedException e) {}
        }
    }
}

class Walk implements Runnable {
    
    public void run() {
        for (int i=0; i<8; i++) {
            System.out.println("Walking");
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {}
        }
    }
}

public class ChewWalk extends Applet {
    Chew chew = new Chew();
    Thread walk = new Thread(new Walk());
    
    public void init() {
        chew.start(); // старт первого потока
        walk.start(); // старт второго потока
    }

}

В Java есть механизм синзронизации параллельных процессов. (Ищи по клюевому слову synchronized.) Вот пример:
Код
import java.applet.*;

class Account {
 
   static int balance = 1000;
   static int expense = 0;

   static public synchronized void withdraw(int amount)
     {
       if (amount <= balance)
         {
           System.out.println("check: " + amount);
           balance -= amount;
           expense += amount;
           System.out.print("bal: " + balance);
           System.out.println(", spent: " + expense);
         }
       else
         {
           System.out.println("bounced: " + amount);
         }
     }
 }

class myThread extends Thread {
   public void run()
     {
       for (int i = 0; i < 10; i++)
         {
           try {
              sleep(100);
             } 
           catch (InterruptedException e) {}
           Account.withdraw((int) (Math.random() * 500 ));
         }
     }
 }

public class synchronize extends Applet {
 
  public void init()
    {
      new myThread().start();
      new myThread().start();
    }    
}
Тут создано два потока(праллельно выполняющихся процесса), а synchronized для withdraw разрещает доступ к этому методу только одному из потоков. (Другой будет ждать, пока метод освободится.)
PM MAIL   Вверх
Lazin
Дата 7.6.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



smile 
а используя нативный код потоки синхронизировать нельзя?

Добавлено через 25 секунд
становится все интересней и интересней smile
PM MAIL Skype GTalk   Вверх
Мастер
Дата 7.6.2008, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Цитата(chipset @ 6.6.2008,  19:27)
Это никак не влияет ни на что. Точно так же могут существовать в одном пространстве и времени данные в какой нибудь shared memory. Как дополнительные функции к обьекту помогут существовать обьекту во в многопоточном пространстве? Эти функции легко вынести за пределы обьекта.

Всё, что можно на Java и на JavaScript, можно сделать и на Си, и на ASM. Разница в том, что Java компилятор и библиотеки помогут. (Поэтому можно написать быстро качественный код.) На Си придётся писать то, что в Java уже есть, и компилятор Си не поможет тебе там, где ты можешь сделать ошибку.

Приведу пример. NASA потеряла миллиард из-за ошибки программиста. Их спутник сгорел в атмосфере Юпитера. (Программист, подлец, перепутал футы с метрами.)
Пример не самый удачный. Есть другой. Нашь спутник (не помню где, на Венере, кажется) помер в семидесятых. Причина: компилятор фортрана. Он не заметил ошибку в коде. 
Тут было что-то связанное с циклом FOR. При некоторых ошибках в его написании, он превращается в валидную, с точки зрения компилятора, стоку.

Добавлено через 5 минут и 19 секунд
Цитата(Lazin @ 7.6.2008,  13:04)
а используя нативный код потоки синхронизировать нельзя?

 smile  smile Если бы это было так, Java не работала бы, поскольку в потоке вызываются системные функции, а они сплошь - native.
PM MAIL   Вверх
Lazin
Дата 7.6.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(Мастер @  7.6.2008,  13:07 Найти цитируемый пост)
Если бы это было так, Java не работала бы, поскольку в потоке вызываются системные функции, а они сплошь - native. 

Это как?

Добавлено через 1 минуту и 12 секунд
Java разве не использует функции ядра операционной системы для синхронизации своих потоков?
PM MAIL Skype GTalk   Вверх
Mayk
Дата 7.6.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 2
Всего: 134



Цитата(Мастер @  7.6.2008,  16:48 Найти цитируемый пост)
В Java есть механизм запуска параллельных процессов. (Ищи по клюевому слову Thread.) Вот пример:

Это фигня а не распараллеливание. Вот эрланг с его легковесными процессами - это айс.

Цитата(Мастер @  7.6.2008,  17:07 Найти цитируемый пост)

Приведу пример. NASA потеряла миллиард из-за ошибки программиста. Их спутник сгорел в атмосфере Юпитера. (Программист, подлец, перепутал футы с метрами.)
Пример не самый удачный. Есть другой. Нашь спутник (не помню где, на Венере, кажется) помер в семидесятых. Причина: компилятор фортрана. Он не заметил ошибку в коде. 
Тут было что-то связанное с циклом FOR. При некоторых ошибках в его написании, он превращается в валидную, с точки зрения компилятора, стоку.

Не совсем понял что к чему. На яве что, нельзя допустить ошибок? smile 




Цитата(MAKCim @  7.6.2008,  16:17 Найти цитируемый пост)
итого с простой арифметикой Java работает в 1.809 / 0.891 ~ 2.03 раза медленнее, чем код ICC

эта строка была отквочена чтоб не забыть забенчить double'ы




Цитата(Lazin @  7.6.2008,  17:04 Найти цитируемый пост)
становится все интересней и интересней smile 

+1

зы. я уже правда потерял нить флейма и о чем мы вообще, но веселье продолжается.

Добавлено через 44 секунды
Цитата(Мастер @  7.6.2008,  16:48 Найти цитируемый пост)
В Java есть механизм синзронизации параллельных процессов. (Ищи по клюевому слову synchronized.) Вот пример:

в posix thread он тоже есть.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Lazin
Дата 7.6.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



этот код делает примерно то-же что и предыдущий пример на java  smile 
Код

boost::recursive_mutex mutex;

void thread_fn()
{
  boost::recursive_mutex::scoped_lock lock_it(mutex);
  for (int i = 0; i < 1000; ++i)
  {
     std::cout << i << std::endl;
  }
}

int main()
{
  boost::thread t(&thread_fn);
  boost::thread v(&thread_fn);
  v.join();
  t.join();
}


Добавлено через 5 минут и 28 секунд
Цитата(Мастер @  7.6.2008,  13:07 Найти цитируемый пост)
Тут было что-то связанное с циклом FOR. При некоторых ошибках в его написании, он превращается в валидную, с точки зрения компилятора, стоку.

 smile 

Цитата(Мастер @  7.6.2008,  13:07 Найти цитируемый пост)
Всё, что можно на Java и на JavaScript, можно сделать и на Си, и на ASM. Разница в том, что Java компилятор и библиотеки помогут. (Поэтому можно написать быстро качественный код.) На Си придётся писать то, что в Java уже есть, и компилятор Си не поможет тебе там, где ты можешь сделать ошибку.
для С++ есть огромное количество библиотек, для Си еще больше... велосипедостроение не для нас smile 

Приведу пример. NASA потеряла миллиард из-за ошибки программиста. Их спутник сгорел в атмосфере Юпитера. (Программист, подлец, перепутал футы с метрами.)
Пример не самый удачный. Есть другой. Нашь спутник (не помню где, на Венере, кажется) помер в семидесятых. Причина: компилятор фортрана. Он не заметил ошибку в коде. 

язык С++, в отличие от Java поддерживает метапрограммирование в compile time, есть как-бы две программы, первая выполняется в compile time, а вторая в run time...
так вот, компилятор С++ можно заставить во время компиляции проверять единицы измерения переменных в выражениях, и он не даст переменной имеющей тип Watt присвоить значение типа Amper smile

Добавлено через 6 минут и 56 секунд
в Java это можно сделать только в runtime
PM MAIL Skype GTalk   Вверх
Мастер
Дата 7.6.2008, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Цитата
Не совсем понял что к чему. На яве что, нельзя допустить ошибок?
Современные компиляторы(ты этого можешь и не знать) устроены так, что синтаксическая ошибка, которую компилятор не увидит, становится маловероятной. (Практически невозможной.)
Логическая ошибка - это уж ты сам. Но и тут, как правило, компилятор помогает, поскольку логическая ошибка, если ты придерживаешься правил ООП, приводит к несоответствию классов, это компилятор отслеживать умеет.
PM MAIL   Вверх
MAKCim
Дата 7.6.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата(W4FhLF @  7.6.2008,  12:27 Найти цитируемый пост)
Так вот, кто такой rei3er

палюсь  smile 
я бы и сам хотел изменить ник, но пока нельзя

Цитата(3 @ 14, 7.6.2008,  12:44 Найти цитируемый пост)
нужно проверить одинаковые ли диапозоны используются для java-кого long (жёстко прописан и не зависит от процессора) и c++ long (зависит от процессора). 

да

Цитата(Мастер @  7.6.2008,  12:48 Найти цитируемый пост)
В Java есть механизм запуска параллельных процессов. (Ищи по клюевому слову Thread.) Вот пример:

гы-гы-гы  smile 

Код

static pthread_mutex_t tty_lock = PTHREAD_MUTEX_INITIALIZER;

static void * chew(void * argument) {
    int i = 0;
    for (; i < 8; i++) {
            pthread_mutex_lock(&tty_lock);
            puts("Chewing");
            pthread_mutex_unlock(&tty_lock);
            sleep(400);
    }
}

static void * walk(void * argument) {
    int i = 0;
    for (; i < 8; i++) {
            pthread_mutex_lock(&tty_lock);
            puts("Walking");
            pthread_mutex_unlock(&tty_lock);
            sleep(300);
    }
}

int main() {
    pthread_t chew_t, walk_t;
    pthread_create(&chew_t, NULL, &chew, NULL);
    pthread_create(&walk_t, NULL, &walk, NULL);
    pthread_join(walk_t, NULL);
    pthread_join(chew_t, NULL);
    return 0;
}



Цитата(Мастер @  7.6.2008,  12:48 Найти цитируемый пост)
В Java есть механизм синзронизации параллельных процессов. (Ищи по клюевому слову synchronized.) Вот пример:

аналогично

Код

#define BALANCE 0
#define EXPENSE 0

static pthread_mutex_t routine_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_key_t data[2];

static void withdraw(int amount) {
    int balance = pthread_getspecific(data[BALANCE]);
    int expense = pthread_getspecific(data[EXPENSE]);
    if (amount <= balance) {
           printf("check: %d\n", amount);
           balance -= amount;
           expense += amount;
           printf("bal: %d, spent: %d\n", balance, expense);
    } else {
        printf("bounced: %d\n", amount);
        return NULL;
    }
    pthread_setspecific(data[BALANCE], (const void*)balance);
    pthread_setspecific(data[EXPENSE], (const void*)expense);
}

static void * routine(void * argument) {
    int i = 0;
    pthread_setspecific(data[BALANCE], (const void*)1000);
    pthread_setspecific(data[BALANCE], (const void*)0);
    for (; i < 10; i++) {
        sleep(100);
        pthread_mutex_lock(&routine_lock);
        withdraw(rand() * 500);
        pthread_mutex_unlock(&routine_lock);
    }
}

int main() {
    pthread_t first, second;
    pthread_key_create(data, NULL);
    pthread_key_create(data + 1, NULL);
    pthread_create(&first, NULL, &routine, NULL);
    pthread_create(&second, NULL, &routine, NULL);
    pthread_join(first, NULL);
    pthread_join(second, NULL);
    return 0;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Мастер
Дата 7.6.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Цитата
Java разве не использует функции ядра операционной системы для синхронизации своих потоков?
Именно это она и делает. Но как она это делает - прописано как раз в native-методах. Реализация механизмов синхронизации потоков и их приоритетов, выделения памяти и сборки мусора - всё сплошь натив. Это ядро Java. Байт код выше. По верх этого.
Возьмите Java1 и посмотрите исходники (как AWT в ней устроено?). (Обалденно интересно.) Тогда вы поймете Java2. Эсли вы первую яву не поняли, то этот монстр(ява два) вам не отдастся никогда.

Это сообщение отредактировал(а) Мастер - 7.6.2008, 14:08
PM MAIL   Вверх
Lazin
Дата 7.6.2008, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(Мастер @  7.6.2008,  14:04 Найти цитируемый пост)
Именно это она и делает. Но как она это делает - прописано как раз в native-методах. Реализация механизмов синхронизации потоков и их приоритетов, выделения памяти и сборки мусора - всё сплошь натив. Это ядро Java. Байт код выше. По верх этого. 

ну тогда она ничего нового не предлагает, все то-же самое что и в других языках =)
PM MAIL Skype GTalk   Вверх
MAKCim
Дата 7.6.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата(Mayk @  7.6.2008,  13:36 Найти цитируемый пост)
эта строка была отквочена чтоб не забыть забенчить double'ы

боюсь, будет разгром
ибо ICC порвет всех

Код

#include <stdio.h>

int main() {
    double t = 0., i, j, k;
    for (i = 0.; i < 1.; i += 0.0005)
        for (j = 0.; j < i; j += 0.0005)
            for (k = 0.; k < j; k += 0.005)
                t += ((i * j * k - 0.75) / (i + j / 34.321 + k + 1.089)) * 1.08;
    printf("%f\n", t);
}


Код

public class Test {
    public static void main(String args[]) {
        double t = 0., i, j, k;
        for (i = 0.; i < 1.; i += 0.0005)
            for (j = 0.; j < i; j += 0.0005)
                for (k = 0.; k < j; k += 0.005)
                    t += ((i * j * k - 0.75) / (i + j / 34.321 + k + 1.089)) * 1.08;
        System.out.printf("%f\n", t);
    }
}

Код

# time java -classpath /home/rei3er Test

real    0m5.328s
user    0m5.280s
sys     0m0.004s

icc
# time ./Test

real    0m2.416s
user    0m2.416s
sys     0m0.000s

gcc
# time ./Test

real    0m2.308s
user    0m2.308s
sys     0m0.000s


 smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Мастер
Дата 7.6.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 17.5.2008

Репутация: нет
Всего: нет



Цитата(Lazin @ 7.6.2008,  14:09)
ну тогда Java ничего нового не предлагает, все то-же самое что и в других языках =)

Ну это ты зря...
Java освобождает тебя от мыслей о том, как это сделано. Ты просто юзаешь удобную, современную вещь. При этом, то, что ты написал, будет работать везде, на любой железке, на которой реализована Java (если, конечно, у железяки мощи хватит исполнить твой код).
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1144 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.