LINUX.ORG.RU

Производительность C++

 ,


7

13

Как насчёт производительности у C++ по сравнению с C? Мои предположения на текущий момент:

1) Код, не использующий возможности C++ (то есть по сути plain C), скомпилированный C++ компилятором будет иметь абсолютно ту же производительность, что и код на С.

2) Исключения и dynamic_cast медленные. Если нам важна производительность, лучше их не использовать.

3) Класс без виртуальных методов, должен быть по производительности эквивалентен сишной структуре и функциям, обрабатывающим её. Не считая копирования. Нужно везде, где можно использовать передачу по указателю или ссылке (собственно, если в Си делать memmove при передаче структуры в качестве аргумента, то это вызовет примерно такой же оверхед, как дефолтный конструктор копирования С++. Верно?).

4) Класс с виртуальными методами полностью аналогичен пункту 3, но при вызове виртуальных методов добавляется небольшой оверхед. Сишный эквивалент obj->vtable->func(obj, ...). Если сравнивать с plain C кодом, реализующим ООП в той же манере (каждая структура-объект имеет поле, указывающее на структуру, содержащую адреса функций работы с ней), то оверхеда по сравнению с plain C не должно быть.

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

6) Шаблоны могут привести к разбуханию кода. Впрочем, #define-ы и inline-функции в C++ могут устроить то же самое. Вопрос: будет ли использование шаблона с одинаковыми параметрами создавать 2 копии реализации или же всё-таки компилятор догадается сделать её лишь один раз. А если шаблон используется с одинаковыми параметрами в нескольких объектных файлах? Будет ли реализация расшариваться между ними или у каждого своя?

7) Что насчёт inline-методов класса? (те, которые описываются прямо в момент определения самого класса, внутри блока class). Может ли их реализация расшариваться между модулями или в каждом будет своя копия (допустим, метод слишком длинный, чтобы инлайнится в момент вызова)?

Я не претендую на правоту, какие-то утверждения могут быть ложными. Хотел бы узнать, как обстоят дела на самом деле. А также какие подводные камни я ещё не знаю. Разумеется, речь идёт о последних версиях gcc/clang с включённой оптимизацией не ниже -O2.

★★★★★

Последнее исправление: KivApple (всего исправлений: 1)

Ответ на: комментарий от KivApple

Потому что в типичном use-case этой либы программе нафиг не нужно знать больше информации об ошибке. Ей тупо надо показать максимально информативное сообщение ПОЛЬЗОВАТЕЛЮ.

В таком случае следовало бы просто использовать тип std::runtime_error, в который и передать информацию, которая подлежит для вывода ПОЛЬЗОВАТЕЛЮ через what() :-) Тогда намерения автора были бы понятны :-) А так, пользуйся, если нравится, выдавай ПОЛЬЗОВАТЕЛЮ сообщения об ошибке, отключай исключения и т.д., как пожелаешь :-) Всего хорошего :-)

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

Да положить мне на жопаскрипт и нативную компиляцию, не интересно это. Ты тявкал про компиляцию жопаскрипта в webassembly, и вот конкретно за этот базар и должен отвечать. Остальное меня не колышет. Не отмазывайся теперь, сучонок, что мол это был не ты, тебя по твоим дебильным лолам узнать легко.

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

В таком случае следовало бы просто использовать тип std::runtime_error, в который и передать информацию, которая подлежит для вывода ПОЛЬЗОВАТЕЛЮ через what()

Код, покажите как будет выглядеть этот код!

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

Но ведь вопрос был о том, какие широко распространённые языки программирования можно компилировать в нативный код

Скомпилируйте JS в нативный код и покажите результат.

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

Это же так просто :-) Оставим runtime_error, т.к. конструкторы его не noexcept :-) Хотя, с твоим опытом, ты поймёшь, конечно, как это сделать :-) Итак, специально для тебя,

#include <cassert>
#include <cstdio>
#include <cstring>

class Error {
public:
  Error() noexcept =default;
  Error(const char* msg) noexcept : msg_(msg) {}

  const char* what() const noexcept { return msg_; }

  bool really_error() const noexcept { return std::strcmp(what(), "") != 0; }
private:
  const char* msg_{""};
};

Error error() noexcept
{
  return Error("The error occurred");
}

Error ok() noexcept
{
  return Error();
}

void test_error(const Error& e) noexcept
{
  std::fprintf(stderr, e.really_error() ? "error\n" : "ok\n");
}

int main(int argc, char *argv[])
{
  assert(error().really_error());
  assert(!ok().really_error());

  test_error(error());
  test_error(ok());

  return 0;
}

Теперь можешь отключать исключения, т.к. везде, где надо, noexcept :-) Всего хорошего :-)

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

Оставим runtime_error

Слив. Уже, прям с ходу. А как дышал, как дышал.

т.к. конструкторы его не noexcept

Матчасть таки нужно учить. Малолетним дебилам особенно.

Но смотрим главное:

class Error {
public:
  Error() noexcept =default;
  Error(const char* msg) noexcept : msg_(msg) {}

  const char* what() const noexcept { return msg_; }

  bool really_error() const noexcept { return std::strcmp(what(), "") != 0; }
private:
  const char* msg_{""};
};

Как в это говно передать динамически сформированную строку? А, смайлик? Опять наговнокодил?

Ну и главное: покажи, как это говно на палочке этот волшебный Error смог бы улучшить API picojson?

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

Слив. Уже, прям с ходу. А как дышал, как дышал.

Хотел ведь как лучше, думал поймёшь, всё таки 20 лет программируешь на C++, но не сложилось :-) Что же, runtime_error, так runtime_error :-)

#include <cassert>
#include <cstdio>
#include <cstring>
#include <stdexcept>

std::runtime_error error()
{
  return std::runtime_error("The error occurred");
}

std::runtime_error ok()
{
  return std::runtime_error("");
}

inline bool really_error(const std::runtime_error& e) noexcept
{
  return std::strcmp(e.what(), "") != 0;
}

void test_error(const std::runtime_error& e) noexcept
{
  std::fprintf(stderr, really_error(e) ? "error\n" : "ok\n");
}

int main(int argc, char *argv[])
{
  assert(really_error(error()));
  assert(!really_error(ok()));

  test_error(error());
  test_error(ok());

  return 0;
}

Матчасть таки нужно учить. Малолетним дебилам особенно.

Да, да, см. в стандарт на сигнатуру конструктора runtime_error :-) Там нет noexcept :-)

Как в это говно передать динамически сформированную строку? А, смайлик? Опять наговнокодил?
Ну и главное: покажи, как это говно на палочке этот волшебный Error смог бы улучшить API picojson?

Не нервничай ты так, экономь силы для своего фреймворка акторов, или что там у тебя :-) Ну, это улучшит API тем, что хотя бы будет видно, что возвращается ошибка :-) Не зря же типы и всё такое имеют место быть :-) Всего хорошего :-)

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

Хотел ведь как лучше

Вы не умеете лучше. Вы даже не умеете так, как говорите.

std::runtime_error ok()
{
  return std::runtime_error("");
}

А теперь подсчитайте, какие у вас будут накладные расходы на возврат пустого runtime_error.

Да, да, см. в стандарт на сигнатуру конструктора runtime_error :-) Там нет noexcept :-)

Дебилушка, вам не в стандарт на сигнатуру методов runtime_error смотреть нужно. А в учебники, которые объясняют, как и для чего используется noexcept.

Не нервничай ты так, экономь силы для своего фреймворка акторов, или что там у тебя :-)

Да я вообще из-под стола пишу. Очередной эпичный фэйл анонима-со-смайликами. И очередное подтверждение того, что C++ громче всего хэйтят те, кто в C++ не могут.

Ну и за меня не беспокойтесь. Сил хватит.

Ну, это улучшит API тем, что хотя бы будет видно, что возвращается ошибка :-)

Т.е. вы предложили из parse всегда возвращать runtime_error, даже когда ошибок нет. А проверять ошибки нужно путем вызова какой-то левой really_error, которая никаким боком с runtime_error не связана? А в случае успешного разбора будет возвращаться runtime_error, созданный вашей говнофункцией ok()? И все это по-вашему лучше, чем есть сейчас в picojson?

Б**, откуда только такие дебилы вылазиют?...

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

Итак, рассуждения профессионального C++-программиста:

Вы не умеете лучше.
Вы даже не умеете так, как говорите.
подсчитайте, какие накладные расходы на возврат пустого runtime_error.
Дебилушка, вам не в стандарт на сигнатуру методов runtime_error смотреть нужно.
Да я вообще из-под стола пишу.
Очередной эпичный фэйл анонима-со-смайликами.
очередное подтверждение того, что C++ громче всего хэйтят те, кто в C++ не могут.
Ну и за меня не беспокойтесь. Сил хватит.
really_error(const runtime_error&), которая никаким боком с runtime_error не связана?
Б**, откуда только такие дебилы вылазиют?...

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

Сказать то чего хотели? Или мне нужно вложить вам в голову объяснения по основным пунктам из составленного вами списка?

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

Так вот - ядро на чистом Си

Маня, ты это коллегам-шарпистам рассказывай. Ядро NT всегда было на расширенном Си - с исключениями (по Win2k включительно); что там сейчас - только ТНБ ведает.

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

Я бы не назвал это исключениями C++.

Там SEH и свои операторы в компиляторе MS под него. SEH на винде впрочем используют все более-менее вменяемые рантаймы, от JVM до SBCL. Такшта, my hair is a bird, etc.

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

Ну, т.е., это как если бы в GCC впилили особенный синтаксис для setjmp/longjpm и синхронных сигналов.

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

Я бы не назвал это исключениями C++.

Ты назвал это «чистым Си». Это была ложь.

Ну, т.е., это как если бы в GCC впилили особенный синтаксис для setjmp/longjpm и синхронных сигналов.

А virtual - это такой особенный синтаксис для вектора функций. А template - такой особенный синтаксис для определения макросов.

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

Это чистый Си с расширениями под конкретные фичи винды. И то, SEH опять же, в ядре не используется. Только в системных сервисах юзерспейса. Угадай почему? Потому же, почему в ядре не используется HeapAlloc (он же malloc).

Плюсовых фич в ядре и драйверах итд, мной замечено не было.

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

У MS, кстати, где-то валяется официальная рекомендация не использовать C++ в kernel mode. Там куча нюансов, начиная с таких банальностей, что надо переопределять new/delete на спец. функции, и заканчивая разными неочевидными плодородными на баги вещами типа vtable etc.

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

Плюсовых фич в ядре и драйверах итд, мной замечено не было.

1) что такое плюсовые фитчи ?
2) откуда тебе знать что есть в ядре если ты в глаза его не видел

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

Ну рендеринг пожалуй не писал, а вот RT OLTP - да. Причем на эрланге, как ни странно.

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

Это чистый Си с расширениями под конкретные фичи винды.

«Чистый Си с расширениями» - это gcc.

И то, SEH опять же, в ядре не используется.

Я не разбираюсь в сортах говна, но конструкции try-except-finally в ядре NT используются. SEH это или еще что - мне пофиг. Главное, что это не Си.

Плюсовых фич в ядре и драйверах итд, мной замечено не было.

У тебя есть исходники ядер венды, которые свежее win2k?

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

где то что то слышал, где то читал, но сам не знаешь? не говори и не утверждай того чего не знаешь

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

Ну положим, во-первых, читал я как-то утекшие сорцы вин2к. Во-вторых, структура API итп в винде, хоть и объектно-ориентированные с ног до головы, но там скорее вот какой-то GObject(а вернее COM и его аналоги, с которых GObject слизали). В третьих, дизасембл разнообразных мест явно может указать на использование C++, ну начиная там с деструкторов и тому подобного. Ан нет. Ни деструкторов, ни исключений(тем более), ни дебильного мэнглинга.

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

Ты несешь херню. Там в принципе не может быть try-catch-finally. Плюсовых - по объективным соображениям, т.к. рантайма плюсов в ядре нет и быть не может. SEH - по причине того что это юзерспейс фича.

К тому же, в ядре винды нет чоткого понятия стека, если чо. Там DPC на DPC, и IRQ да APC погоняет. Т.е. если по-русски, ядро устроено так, что фреймы вызовов функций и вообще драйверного/ядерного кода - работают в отложенном режиме и формируются явно. Какие там вообще исключения могут быть, с такими порядками, тем более плюсовые?

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

Вы лучше вот это объясните:

We use almost entirely C, C++, and C# for Windows. Some areas of code are hand tuned/hand written assembly.

Это ведь сотрудник MS на форуме MS рассказал. Он чего-то не знает, что знаете вы?

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

Ты несешь херню. Там в принципе не может быть try-catch-finally. Плюсовых - по объективным соображениям, т.к. рантайма плюсов в ядре нет и быть не может. SEH - по причине того что это юзерспейс фича.

O_O

Этот какой-то фейспалм. Еще в Inside Windows NT было сказано, что _ядро_ NT написано с использованием исключений, сейчас я смотрю в утекшие исходники Win2k и вижу там try-except-finally, а ты говоришь мне, что этого нет? Как я посмотрю, ты на своей волне.

Какие там вообще исключения могут быть, с такими порядками, тем более плюсовые?

Да, ты точно на своей волне. Про плюсовые исключения говоришь почему-то.

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

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

Ну типа, ср. «We use almost entirely C, C++, Vala, Lua and Govno for Ubuntu. Some areas of code are hand tuned/hand written javascript».

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

Пример кода и строки.

И ещо раз, как DPC и схема выполнения фреймов по приоритету IRQL сочетаеца с эксепшнами, по-твоему?

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

Пример кода и строки.

private/ntos/mm/creasect.c:273

        try {
            ProbeForWriteHandle(SectionHandle);

            if (ARGUMENT_PRESENT (MaximumSize)) {

                //
                // Note we only probe for byte alignment because prior to NT 5,
                // we never probed at all.  We don't want to break user apps
                // that had bad alignment if they worked before.
                //

                ProbeForRead(MaximumSize, sizeof(LARGE_INTEGER), sizeof(UCHAR));
                LargeSize = *MaximumSize;
            } else {
                ZERO_LARGE (LargeSize);
            }

        } except (EXCEPTION_EXECUTE_HANDLER) {
            return GetExceptionCode();
        }

И ещо раз, как DPC и схема выполнения фреймов по приоритету IRQL сочетаеца с эксепшнами, по-твоему?

Расскажи, какие проблемы ты видишь.

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

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

Ну а теперь перечитайте на что именно вы возбудились:

Еще раз, для малолетних дебилов: «Ну и опыт Linux-а не мешает людям делать ОСы на C++.» Т.е. не валить на кресты, а делать на крестах: Windows, например, или OSv. Из прошлого — BeOS, Symbian, PalmOS.

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

А еще он шарпист, эрлангист, идейный вендузятнег, алкоголик. И просто классный парень ловсанчег, который вечно учит людей их ремеслу, за что его низводят и курощают.

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

Код похож на SEH. Кроме момента что try-except пишутся __try и __except. Но надо смотреть. На слово я тебе не верю. Хотя могу и ошибаться.

Проблемы - например в том что стека в обычном понимании НЕТ(Т.е. escaping continuations, т.е. всякие эксепшны, теряют смысл. А полноценные continuations в си особо не завезли еще). Нету стека - нету мультиков. Разве что там еба-преобразование типа async/await в fsm, но я в это верю слабо, я лично столько не скурю - а уж я то скурить способен многое.

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

Проблемы - например в том что стека в обычном понимании НЕТ

Мля, ну ты же бредишь. Установка уровня IRQL - это просто маскирование прерываний, DPC - это тупо пара указателей в какой-нибудь очереди. Какие escaping continuations, что ты несешь.

Нету стека - нету мультиков. Разве что там еба-преобразование типа async/await в fsm,

double_facepalm.jpg

уж я то скурить способен многое.

Это да. И сюда ты приперся уже укуренным.

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

Там про ядро сначало было.

Но ладно, вобщем расскажу вам, аборигенам, как сейчас дела на наших виндовсах. Дела таковы, что есть а) ядро и системные сервисы - пишутся бородатыми укурками на чистом си и своих языках во время пребывания в астрале. б) легаси-софт, медленно улучшаемый и переписываемый на дотнет - тут начиная с эксплорера и заканчивая офисом. Все это пишется внутри МС, как правило. в) энтерпрайз - пишется исключительно на C#, в данный момент на C# 5-6 и .NET 4.5 как правило. г) Хипстеры и мелкие приложения - пишутся на Win RT, на всяких JS, но иногда и на C#.

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

Сказать то чего хотели?

То, что ты, сидя под столом, не знаешь даже, что такое noexcept, раз никак до тебя не доходит в чём смысл Error parse(..) noexcept :-) Всё про какие-то учебники указывает :-) Эксперт, называется :-)

Или мне нужно вложить вам в голову объяснения по основным пунктам из составленного вами списка?

Не нужно :-)

anonymous
()
Ответ на: комментарий от tailgunner

Ты не понял. Ты вот никогда не писал драйвера под винду а зря. Там любое обращение к другому компоненту заставляет тебя свой компонент ставить в очередь, создавать для него стекфрейм и уходить на перекур. Очень похоже на то как в C# async/await работает, разве что все это руками делается. А поскольку драйвера как раз только что и делают, как к другим частям ОС и к другим драйверам обращаются, то там считай все время такие дела. И у тебя вместо стека в обычном понимании, образуется некие куски поставленного в очередь кода с поставленными в очередь фреймами. Куски как правило маленькие причем. И где тут можно воткнуть исключения, и главное, зачем - я не понимаю.

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

Не нужно :-)

А там я не у вас спрашивал. С вами-то все понятно. Тем более после очередной демонстрации.

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

Ты не понял.

Пока что это ты не понимаешь. Причем не понимаешь ничего.

где тут можно воткнуть исключения, и главное, зачем - я не понимаю.

Рассмотри вариант, что твое представление о работе ОС, почерпнутое из рекламных материалов C# - просто наркотический бред. Это всё объяснит.

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

Мое представление о работе винды +- вменяемое. За столько-то лет уж основы драйверописательства и работы ядра хотя бы выучил. Я даже как-то чуть свой софтвар-реализацию D3D не написал.

Не, я понимаю, что в линупсках все как в 60х, начиная с архитектуры и заканчивая реализацией, но это в линупсах, не стоит заниматься переносом, да.

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

Мое представление о работе винды +- вменяемое

Бгг. Ну да, это видно в глазенках, широко распахнутых при виде try-except.

За столько-то лет уж основы драйверописательства и работы ядра хотя бы выучил. Я даже как-то чуть свой софтвар-реализацию D3D не написал.

Так ты и основы почти выучил. Очень почти.

Не, я понимаю, что в линупсках все как в 60х, начиная с архитектуры и заканчивая реализацией, но это в линупсах, не стоит заниматься переносом, да.

Это ты Microsoft скажи. Что микроядра рулят, а MinWin - это технология 60-х.

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

А там я не у вас спрашивал.

Мало того, что ты C++ знаешь так себе, так ещё и не можешь определить с кем общаешься :-) Тот список, составленный из твоей словесной желчи составил смайлик :-)

С вами-то все понятно. Тем более после очередной демонстрации.

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

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

смайлик свои слова подкрепил несложным говнокодом

/fixed

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

Мало того, что ты C++ знаешь так себе, так ещё и не можешь определить с кем общаешься :-)

В упор не видел там ваших фирменных опознавательных знаков.

Так смайлик свои слова подкрепил корректным, чистым и понятным кодом

Бгг. Ща проржусь, пройдусь по вашему коду подробнее.

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

Лол. Ты сначала Торвальдсу скажи, каких годов монолитное ядро. Еще раз, про try-except вопрос не до конца проанализирован. Возможно, это просто троллинг. Надо верифицировать.

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

Ты сначала Торвальдсу скажи, каких годов монолитное ядро

О вау. Родной, ядро NT - такой же монолит, как Linux. Но, в отличие от Linux, они засунули в ядро и оконную систему (а сейчас - еще и эмулятор Linux API). Так что не идейным вендузятнегам возникать об архитектуре ОС.

Возможно, это просто троллинг

Да, Хелен Кастер тебя ненавидит.

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

NT - микроядро с частью сервисов в кернел-спейсе ради производительности, не надо тут дезинформацию разводить.

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

NT - микроядро с частью сервисов в кернел-спейсе ради производительности

Ловсанчег, ты тупой транслятор устаревшей рекламы MS. Встретишь Катлера - спроси его, что он думает о микроядрах.

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