LINUX.ORG.RU
ФорумTalks

Откуда берётся разница в скорости языков

 ,


0

1

Говорят, что Java и Питон тормозят, а C++ быстрый. Естественно, одних слухов недостаточно, но ведь неспроста же они возникли. Собственно, суть вопроса: на мой взгляд (неискушенный), в программе (если абстрагироваться от ресурсов системы) может тормозить только алгоритм. Но корявый алгоритм можно использовать где угодно и замедлит он тоже что угодно. Откуда тогда берётся разница в скорости работы программ на разных языках?

★★

Кроме алгоритма есть ещё и его оптимизация. Если выполнять любой алгоритм без оптимизации, будет тормозить сильнее питона. Все компиляторы/интерпретаторы оптимизируют по-разному.

CYB3R ★★★★★
()

Как работает программа, скомпилированная из C++: «по адресам a и b есть переменные целого типа, взять их сложить, записать по адресу c»

Как работает программа на python:

1) Найти в хеш-таблице адрес структуры данных, описывающей переменную a

2) Найти в хеш-таблице адрес структуры данных, описывающей переменную b

3) Проверить тип переменной a, если он не равен Integer то перейти к процедуре выкидывания исключения

4) Проверить тип переменной b ...

5) и т.д.

crowbar
()

Некоторые языки выносят множество всякой дряни в рантайм. Например в ОБжСи можно вызывать методы у нулевого указателя. Я не спец, по компиляторам, но мне кажется, что это не приводит к сегфолту за счёт дополнительной проверки. Проверки при каждом обращении к каждому указателю. В Си такой проверки нет. Как нет и проверки на диапазоны массива.

Stahl ★★☆
()

Ахтунг ! Бабы инсталлируют мой Линукс ! Ты троллишь или действительно не понимаешь разницы между интерпретатором, виртуальной машиной, и компилятором ?

lenin386 ★★★★
()

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

invy ★★★★★
()

Ответ кроется в кривых пука разработчиков.

fedorino_gore
()
Ответ на: комментарий от Valdor

Нет, ты не понимаешь разницы. Если бы понимал, то осознавал бы, что сложить 2 числа в машинном коде - это 1-2 такта процессора. А всосать строку кода из файла, расшифровать её, проинтерпретировать - это сотни тысяч тактов.

lenin386 ★★★★
()
Ответ на: комментарий от Stahl
#include <iostream>

class Object
{
public:
    int test(int n)
    {
        std::cout << "Kokoko " << n << std::endl;
        return 0;
    }
};

int main(int argc, char **argv)
{
    Object *o = 0;
    return o->test(100500);
} 
[kosyak@desktop ~]$ ./test 
Kokoko 100500
Kosyak ★★★★
()
Ответ на: комментарий от Valdor

Проверка типа переменной, КМК, есть и в C++.

Только на этапе компиляции.

lenin386 ★★★★
()
Ответ на: комментарий от Valdor

Проверка типа переменной, КМК, есть и в C++. Нельзя же там сложить яблоко и 32?

В С++ проверка происходит во время компиляции, а не в райнтайме.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DELIRIUM

Можно, если метод не обращается к внутренним данным, то есть не разыменовывает this.

Это UB.

DarkEld3r ★★★★★
()
Ответ на: комментарий от crowbar

Естественно, но все компиляторы это позволяют делать. Собственно, именно потому, что проверок нет, такая гадость возможна.

Kosyak ★★★★
()

Ты когда-нибудь компилировал программы? Ты знаешь, сколько времени занимает компиляция? Java и Python делают это на ходу.

Black_Shadow ★★★★★
()
Ответ на: комментарий от Harald

Ну пока идёт лишь обращение в функциям и не дёргаются переменные, то всё будет ок.
Функция она и в Африке функция, даже если её методом назовут:)
Но в общем случае получим сегфолт.
Да и вообще это противоречит здравому смыслу

Stahl ★★☆
()

Жабка — она на то и жабка, чтобы душить тормозить.

Eddy_Em ☆☆☆☆☆
()

Java тормозит из-за GC и медленного старта, а так то она быстро работает.

umren ★★★★★
()
Ответ на: комментарий от crowbar

Как работает программа, скомпилированная из C++: «по адресам a и b есть переменные целого типа, взять их сложить, записать по адресу c»

А потом появляются всякие «течки» и начинает тормозить не только программа, но и операционная система

Siado ★★★★★
()
Ответ на: комментарий от puding

Чем выше язык, тем он тормознее, верно и обратное.

Значит самый высокий язык - джава.

Удивительно, но даже гткшные приложения на питоне не так тормозят, как гткшные на джаве

Siado ★★★★★
()
Ответ на: комментарий от Siado

Ты использовал java-gnome? У меня он очень быстро работал.

CYB3R ★★★★★
()
Последнее исправление: CYB3R (всего исправлений: 1)
Ответ на: комментарий от Stahl

Ну хоть это и UB, и так писать не надо, с точки зрения того, как работает компилятор - вполне нормально, потому что в процессе компиляции:

class A { void f(int n) { ... } };
превращается в нечто вида:
void a_f(A* p, int n) { ... }
Потому вызов a_f(nullptr, 100500) вполне себе валидный.

invy ★★★★★
()
Ответ на: комментарий от Kosyak

Это UD по стандарту. В данном случае просто реализация такая.

KennyMinigun ★★★★★
()
Ответ на: комментарий от Stahl

В C++ вполне можно сделать ((my_structure*)0)->method();

А вот к чему это приведет - другой вопрос.

cvs-255 ★★★★★
()
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от crowbar

В чем же UB? 0 - ничем с точки зрения языка не хуже любого другого указателя.

И если в адресном пространстве есть адрес 0, то даже сегфолта не будет.

например, на x86 в реальном режиме можно сделать что-то такое

class rm_interrupt {
    void (*handler)(void);
    public:
        void set_handler(void (*new_handler)(void)) {handler = new_handler;}
}
.....
void main(void)
{
    rm_interrupt *zero = 0;
    zero->set_handler(zero_int_hdl);
}

cvs-255 ★★★★★
()
Последнее исправление: cvs-255 (всего исправлений: 2)
Ответ на: комментарий от Stahl

с чего бы? ещё как обязано. Х.func(a) == func(&X, a) на самом деле.

если Y == nullptr, то Y->func(a) == func(nullptr, a)

ну и чего, собственно? разыменование производится внутри функции, а не при вызове. поэтому вызов хоть и UB, но вполне безопасен, если вы знаете что делаете. более того, внутри метода может быть даже delete this.

next_time ★★★★★
()
Ответ на: комментарий от NeXTSTEP

Дваждую, Томми подтверждает, ой, то есть то, что осталось от Томми.

soslow
()

Переформулирую вопрос: «Какого черта, на дворе уже почти 2015 год, а все это дерьмо умеет либо тормозить, либо очень сильно тормозить?»

buddhist ★★★★★
()
Ответ на: комментарий от Quasar

Ниоткуда. Нет никакой разницы в скорости языков. Вообще нет и быть не может.

+1, для Си например есть как компиляторы, так и интерпретаторы, при чём тут вообще язык?

mbivanyuk ★★★★★
()

В последнее время уж слишком часто стали появляться типапосты с типатроллингом и «жабатормозит». Каникулы что ли?

GblGbl ★★★★★
()
Ответ на: комментарий от GblGbl

Тяжело тебе жить. Что не вопрос - то троллинг в нём видится.

Valdor ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.