Re[9]: Вот еще, или я, кажется, читать разучился
От: Evgeny.Panasyuk Россия  
Дата: 20.02.13 17:08
Оценка:
Здравствуйте, niXman, Вы писали:

X>я готов платить 5% за то чтоб не обрабатывать коды ошибок через каждые пять строк =)


На 5% больше по сравнению с чем?
С кодом вообще без обработки ошибок?
Или с полным эквивалентом в виде "if(errorN) goto ErrorN;" ?
Re[10]: Вот еще, или я, кажется, читать разучился
От: niXman Ниоткуда https://github.com/niXman
Дата: 20.02.13 19:15
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>На 5% больше по сравнению с чем?

EP>С кодом вообще без обработки ошибок?
да.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: Вот еще, или я, кажется, читать разучился
От: artem.komisarenko Украина  
Дата: 20.02.13 20:50
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>A: Tizen does not use the C++ exception mechanism. This reduces its footprint and runtime overhead. As a result, any exception occurring in C++ object construction cannot be reported to the application.


Знаю я одни таких дебилов из одной Г конторы, которые редусили использование памяти на мобилках и не включили в стандартную поставку libstdc++ и поддержку исключений. В результате каждое второе нативное приложение стало таскать с собой собственную версию libstdc++.
Экономисты б***
Re[11]: Вот еще, или я, кажется, читать разучился
От: Evgeny.Panasyuk Россия  
Дата: 20.02.13 21:02
Оценка: 9 (3)
Здравствуйте, niXman, Вы писали:

EP>>На 5% больше по сравнению с чем?

EP>>С кодом вообще без обработки ошибок?
X>да.

Набросал тест exceptions vs if-error-goto:
В случае exceptions, код следующего вида:
static void call()
{
    Holder h0;
    exceptions<iter-1>::call(); // may throw

    Holder h1;
    exceptions<iter-1>::call(); // may throw
    // ...
}

В случае if-error-goto:
static bool call()
{
    bool result = true;
    void *d0;
    void *d1;
    // ...

    d0 = mallocator();
    if(! (result=ifgoto<iter-1>::call()) ) // may fail
        goto ERROR0;

    d1 = mallocator();
    if(! (result=ifgoto<iter-1>::call()) ) // may fail
        goto ERROR1;
    // ...

    // ...
    ERROR1: free(d1);
    ERROR0: free(d0);

    return result;
}

  реализация
#include <boost/range/algorithm/nth_element.hpp>
#include <boost/preprocessor/arithmetic/sub.hpp>
#include <boost/preprocessor/repeat.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/noncopyable.hpp>
#include <boost/timer/timer.hpp>
//#include <boost/timer.hpp>

#include <iostream>
#include <ostream>
#include <cstdlib>
#include <vector>
#include <ctime>

using namespace std;
using namespace boost;

// ______________________________ //

const int series = 33;
const int deepness = 5;
#define REPEATS 32

// ______________________________ //

bool error_check()
{
    //return time(0) < 1;
    static volatile bool t = false;
    return t;
}
void *mallocator()
{
    return malloc(4);
}

// ______________________________ //

class Holder : private noncopyable
{
    void *data;
public:
    Holder()
        : data(mallocator())
    {}
    ~Holder()
    {
        free(data);
    }
};
template<int iter> struct exceptions
{
    static void call()
    {
        #define EXP_REP(z, i, _) Holder h##i; exceptions<iter-1>::call();
            BOOST_PP_REPEAT(REPEATS,EXP_REP,t)
    }
};
template<> struct exceptions<0>
{
    static void call()
    {
        if(error_check()) throw false;
    }
};

// ______________________________ //

template<int iter> struct ifgoto
{
    static bool call()
    {
        bool result = true;

        #define IFG_REP0(z, i, _) void *d##i;
            BOOST_PP_REPEAT(REPEATS,IFG_REP0,t)

        #define IFG_REP1(z, i, _) d##i = mallocator(); if(! (result=ifgoto<iter-1>::call()) ) goto ERROR##i;
            BOOST_PP_REPEAT(REPEATS,IFG_REP1,t)

        #define IFG_REP_AUX(i) BOOST_PP_CAT(ERROR,i): free(BOOST_PP_CAT(d,i));
        #define IFG_REP2(z, i, _) IFG_REP_AUX( BOOST_PP_SUB(BOOST_PP_SUB(REPEATS,1),i) )
            BOOST_PP_REPEAT(REPEATS,IFG_REP2,t)

        return result;
    }
};
template<> struct ifgoto<0>
{
    static bool call()
    {
        return error_check() == false;
    }
};

// ______________________________ //

template<template<int> class test_case>
void test(const char *name)
{
    cout << name;
    vector<double> times;
    for(int i=0;i!=series;++i)
    {
        //timer t;
        timer::cpu_timer t;
        test_case<deepness>::call();
        times.push_back(double(t.elapsed().user));
    }
    vector<double>::iterator median = times.begin() + times.size()/2;
    nth_element(times,median);
    cout << "\tmedian is " << (*median)*1e-6 << "ms" << endl;
}

int main()
{
    try
    {
        for(int i=0;i!=2;++i)
        {
            test<exceptions>("exceptions");
            test<ifgoto>("if-error-goto");
        }
    }
    catch(...){}
}

В обоих случаях сравниваются happy-path.
Результаты MSVC2010SP1Rel x64, Release:
С включёнными исключениями(default, /EHsc):
exceptions      median is 1731.61ms
if-error-goto   median is 1762.81ms
exceptions      median is 1731.61ms
if-error-goto   median is 1747.21ms

С выключенными исключениями (чтобы исключить их возможное влияние на if-error-goto):
exceptions      median is 1326.01ms
if-error-goto   median is 1716.01ms
exceptions      median is 1326.01ms
if-error-goto   median is 1716.01ms

1731.61 / 1716.01 ~= 1.0091
Re[12]: Вот еще, или я, кажется, читать разучился
От: MTD https://github.com/mtrempoltsev
Дата: 20.02.13 21:19
Оценка: 23 (3)
Мои пять копеек:


mt@mint14 ~/Desktop $ g++ exceptions.cpp -O3
mt@mint14 ~/Desktop $ time ./a.out

real 0m53.612s
user 0m49.559s
sys 0m0.028s
mt@mint14 ~/Desktop $ gcc error_code.c -O3 -std=c99
mt@mint14 ~/Desktop $ time ./a.out

real 0m53.730s
user 0m49.647s
sys 0m0.024s




Код:

const int MAX_COUNT = 100000000;

char buf;
int count = 0;

void open()
{
    if (++count == MAX_COUNT)
    {
        count = 0;
        throw 1;
    }
}

void read(char* c)
{
    *c = buf;
    if (++count == MAX_COUNT)
    {
        count = 0;
        throw 1;
    }
}

void send(char* c)
{
    buf = *c;
    if (++count == MAX_COUNT)
    {
        count = 0;
        throw 1;
    }
}

int main()
{
    for (int i = 0; i != 1000; ++i)
    {
        try
        {
            open();
            char c;
            for (int j = 0; j != MAX_COUNT + 1; ++j)
            {
                read(&c);
                send(&c);
            }
        }
        catch (const int&)
        {
        }
    }
}



#define MAX_COUNT 100000000

char buf;
int count = 0;

int open()
{
    if (++count == MAX_COUNT)
    {
        count = 0;
        return -1;
    }
    return 0;
}

int read(char* c)
{
    *c = buf;
    if (++count == MAX_COUNT)
    {
        count = 0;
        return -1;
    }
    return 0;
}

int send(char* c)
{
    buf = *c;
    if (++count == MAX_COUNT)
    {
        count = 0;
        return -1;
    }
    return 0;
}

int main()
{
    for (int i = 0; i != 1000; ++i)
    {
        if (open() == -1)
            continue;
        char c;
        for (int j = 0; j != MAX_COUNT + 1; ++j)
        {
            if (read(&c) == -1)
                break;
            if (send(&c) == -1)
                break;
        }
    }
}
Re[3]: Вот еще, или я, кажется, читать разучился
От: landerhigh Пират  
Дата: 21.02.13 00:01
Оценка:
Здравствуйте, artem.komisarenko, Вы писали:

L>>A: Tizen does not use the C++ exception mechanism. This reduces its footprint and runtime overhead. As a result, any exception occurring in C++ object construction cannot be reported to the application.


AK>Знаю я одни таких дебилов из одной Г конторы,


Я, кажется, знаю эту контору

AK>которые редусили использование памяти на мобилках и не включили в стандартную поставку libstdc++ и поддержку исключений.


Ага, а для еще большей экономии поставили Java-машину на мобилки. Впрочем, с NDKr5 исключения стали доступны.

AK>В результате каждое второе нативное приложение стало таскать с собой собственную версию libstdc++.


А вот это да

AK>Экономисты б***


Профессиональные взвешиватели боингов, чо.
www.blinnov.com
Re[13]: Вот еще, или я, кажется, читать разучился
От: landerhigh Пират  
Дата: 21.02.13 00:22
Оценка:
Здравствуйте, MTD, Вы писали:

Подытожим — runtime оверхед незначительный, если вообще есть.
Осталось оценить увеличение размера кода (таблицы обработчиков и все такое).
www.blinnov.com
Re[6]: Вот еще, или я, кажется, читать разучился
От: jazzer Россия Skype: enerjazzer
Дата: 21.02.13 01:29
Оценка: 1 (1) +3
Здравствуйте, landerhigh, Вы писали:

L>Интересно, кто-то наверняка ведь должен был оценить медианный размер кода, в котором макаро оверхед от анализа кодов возврата на каждый чих начинает сводить на нет выгоду от отказа от исключений, которые имеют "footprint and runtime overhead"?


Особенно смешно выглядит эта экономия на фоне
map.Add(new String(L"Zero"), new Integer(0));
map.Add(new String(L"One"), new Integer(1));
map.Add(new String(L"Two"), new Integer(2));

и
IMapEnumerator* pMapEnum = map.GetMapEnumeratorN();
delete pMapEnum;
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: это не Tizen 2.0!!!!
От: jazzer Россия Skype: enerjazzer
Дата: 21.02.13 01:49
Оценка:
Здравствуйте, niXman, Вы писали:

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


C>>А при чем здесь Tizen? Ваш eao197 просто не в теме. Самсунг как и обещал еще в прошлом году, добавил поддержку апи Бады.

C>>Сравните:
C>>здесь tizen
C>>и
C>>здесь бада
X>я не уверен, что из этого хуже %)
"Оба хуже" (с)

Второе очевидно хуже.
В первом по крайней мере честно просят передавать указатели, и хранят тоже указатели.
А во втором принимают константные ссылки, которые могут указывать на что угодно, в том числе и на временные объекты.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[13]: Вот еще, или я, кажется, читать разучился
От: niXman Ниоткуда https://github.com/niXman
Дата: 21.02.13 04:30
Оценка:
MTD, Evgeny.Panasyuk, осталось понять, что является истинной причиной некоторых, отказ от использования исключений. ибо я сомневаюсь, что причина отказа кроется в мегаоверхеде =)
в двух примерах, кстати, используются неоверхедные исключения(SEH & DWARF).
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: Вот еще, или я, кажется, читать разучился
От: niXman Ниоткуда https://github.com/niXman
Дата: 21.02.13 04:31
Оценка: :)
Здравствуйте, landerhigh, Вы писали:

L>Я, кажется, знаю эту контору

что за контора?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[14]: Вот еще, или я, кажется, читать разучился
От: MTD https://github.com/mtrempoltsev
Дата: 21.02.13 05:05
Оценка: +1
Здравствуйте, niXman, Вы писали:

X>MTD, Evgeny.Panasyuk, осталось понять, что является истинной причиной некоторых, отказ от использования исключений. ибо я сомневаюсь, что причина отказа кроется в мегаоверхеде =)


Причины сугубо иррациональные. Контингент отказывающихся делится на две части:
1. Бородатые дядьки которые в начале 90-х попробовали С++ и обожглись, а теперь негативный опыт проецируют на сегодняшнее положение дел
2. Условно молодежь, которая смотря на авторитетов (бородатых дядек), подражает им не понимая причин
Re[15]: Вот еще, или я, кажется, читать разучился
От: niXman Ниоткуда https://github.com/niXman
Дата: 21.02.13 05:07
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>1. Бородатые дядьки которые в начале 90-х попробовали С++ и обожглись, а теперь негативный опыт проецируют на сегодняшнее положение дел

а что, в начале 90-ых, с исключениями в с++ было не так?
(я тогда еще совсем сопливый был)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[16]: Вот еще, или я, кажется, читать разучился
От: MTD https://github.com/mtrempoltsev
Дата: 21.02.13 05:28
Оценка:
Здравствуйте, niXman, Вы писали:

X>а что, в начале 90-ых, с исключениями в с++ было не так?

X>(я тогда еще совсем сопливый был)

Да я тогда только в школе учился, поэтому знаю только со слов бородатых дядек Язык еще не устоялся, программировать на нем никто не умел, компиляторы были глючные и т.д. Читал у Спольски, что команда Экселя написала свой компилятор С++, чтобы юзать шаблоны.
Re[5]: Вот еще, или я, кажется, читать разучился
От: landerhigh Пират  
Дата: 21.02.13 05:32
Оценка:
Здравствуйте, niXman, Вы писали:

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


L>>Я, кажется, знаю эту контору

X>что за контора?

Да есть одна такая. На букву Г как раз.
www.blinnov.com
Re[17]: Вот еще, или я, кажется, читать разучился
От: niXman Ниоткуда https://github.com/niXman
Дата: 21.02.13 06:08
Оценка:
Здравствуйте, MTD, Вы писали:

MTD>Да я тогда только в школе учился, поэтому знаю только со слов бородатых дядек Язык еще не устоялся, программировать на нем никто не умел, компиляторы были глючные и т.д. Читал у Спольски, что команда Экселя написала свой компилятор С++, чтобы юзать шаблоны.


впервые, Си я потрогал в 99ом, на Dell с i386+4MB памяти. это был borland turbo C-2.0 =)
в 97ом, тыкал бейсик, на этом %)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[6]: Вот еще, или я, кажется, читать разучился
От: niXman Ниоткуда https://github.com/niXman
Дата: 21.02.13 06:10
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>Да есть одна такая. На букву Г как раз.

понятно-понятно. не знал, что там тоже отказались от исключений. а говорят, что в Г работают только адекваты =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: Вот еще, или я, кажется, читать разучился
От: Ops Россия  
Дата: 21.02.13 06:39
Оценка:
Здравствуйте, niXman, Вы писали:

X>понятно-понятно. не знал, что там тоже отказались от исключений. а говорят, что в Г работают только адекваты =)


http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
ОФФ видимо)
От: Figaro Россия  
Дата: 21.02.13 07:46
Оценка:
Да вообще-то был еще Turbo 1.0, не хочу лезть в инет, но кажется его увидел в 1990, а с 1991 уже использовал Turbo C 2.0... Сишку на PDP увидел впервые году эдак в 1987 (15 лет было)... но это лично мое, можно много вспомнить и из жизни с ЕС-ок, там и фортран и Пролог и Паскакаль... Но плюсы только опосля Борланда 3.1 пользовал... Ностальджи..
avalon/1.0.432
Re: ОФФ видимо)
От: niXman Ниоткуда https://github.com/niXman
Дата: 21.02.13 07:48
Оценка:
Здравствуйте, Figaro, Вы писали:

F>Но плюсы только опосля Борланда 3.1 пользовал

плюсы я с ним и учил.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.