Информация об изменениях

Сообщение Re[15]: Какие у исключений проблемы? от 05.11.2014 13:25

Изменено 05.11.2014 13:39 AlexRK

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

WH>1)А где у тебя тут коды возврата?

WH>Не вижу. То как ты реализовал функции func1_* к кодам возврата отношения не имеет.

Да? То есть проверка результата malloc — это не код возврата?

WH>try/catch в реальном приложении стоит снаружи цикла.


Когда снаружи — для одного исключения ничего не меняется, я проверял.

WH>2)Я что-то с ходу не нашел как исключения в .NET реализованы.






Так сойдет?
        int func1_1(int a, out int result)
        {
            result = a + 1;

            if (a > 1000000)
                return -1;
            else
                return 0;
        }

        int func1_2(int a, out int result)
        {
            if (func1_1(a, out result) == 0)
                return 0;
            else
                return -1;
        }

        int func1_3(int a, out int result)
        {
            if (func1_2(a, out result) == 0)
                return 0;
            else
                return -1;
        }

        int func1_4(int a, out int result)
        {
            if (func1_3(a, out result) == 0)
                return 0;
            else
                return -1;
        }

        int func1_5(int a, out int result)
        {
            if (func1_4(a, out result) == 0)
                return 0;
            else
                return -1;
        }

        int func2_1(int a)
        {
            if (a > 1000000)
                throw new Exception("qq");

            return a + 1;
        }

        int func2_2(int a)
        {
            return func2_1(a);
        }

        int func2_3(int a)
        {
            return func2_2(a);
        }

        int func2_4(int a)
        {
            return func2_3(a);
        }

        int func2_5(int a)
        {
            return func2_4(a);
        }

        private string Run(string title, int max)
        {
            var start1 = DateTime.Now;
            int res1 = 0;
            for (int i = 0; i < max; i++)
            {
                int val;
                func1_5(i, out val);
                res1 += val;
            }
            var end1 = DateTime.Now;

            var start2 = DateTime.Now;
            int res2 = 0;
            try
            {
                for (int i = 0; i < max; i++)
                {
                    res2 += func2_5(i);
                }
            }
            catch
            {
                // do nothing
            }
            var end2 = DateTime.Now;

            return String.Format("{0}: {1} ({2}), {3} ({4})", title, end1 - start1, res1, end2 - start2, res2);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Run("test run", 1000010);

            var line1 = Run("Single exception", 1000002);
            var line2 = Run("Two exceptions", 1000003);

            System.IO.File.WriteAllLines("D:\\temp.txt", new[] { line1, line2 });
        }


Результат:
Single exception: 00:00:00.0890089 (1786293667), 00:00:00.1050105 (1785293665)
Two exceptions: 00:00:00.0950095 (1787293670), 00:00:00.1080108 (1785293665)

Сливают исключения, сливают.
Re[15]: Какие у исключений проблемы?
Здравствуйте, WolfHound, Вы писали:

WH>1)А где у тебя тут коды возврата?

WH>Не вижу. То как ты реализовал функции func1_* к кодам возврата отношения не имеет.

Да? То есть проверка результата malloc — это не код возврата?

WH>try/catch в реальном приложении стоит снаружи цикла.


Когда снаружи — для одного исключения ничего не меняется, я проверял.

WH>2)Я что-то с ходу не нашел как исключения в .NET реализованы.






Так сойдет?
        int func1_1(int a, out int result)
        {
            result = a + 1;

            if (a > 1000000)
                return -1;
            else
                return 0;
        }

        int func1_2(int a, out int result)
        {
            if (func1_1(a, out result) == 0)
                return 0;
            else
                return -1;
        }

        int func1_3(int a, out int result)
        {
            if (func1_2(a, out result) == 0)
                return 0;
            else
                return -1;
        }

        int func1_4(int a, out int result)
        {
            if (func1_3(a, out result) == 0)
                return 0;
            else
                return -1;
        }

        int func1_5(int a, out int result)
        {
            if (func1_4(a, out result) == 0)
                return 0;
            else
                return -1;
        }

        int func2_1(int a)
        {
            if (a > 1000000)
                throw new Exception("qq");

            return a + 1;
        }

        int func2_2(int a)
        {
            return func2_1(a);
        }

        int func2_3(int a)
        {
            return func2_2(a);
        }

        int func2_4(int a)
        {
            return func2_3(a);
        }

        int func2_5(int a)
        {
            return func2_4(a);
        }

        private string Run(string title, int max)
        {
            var start1 = DateTime.Now;
            int res1 = 0;
            for (int i = 0; i < max; i++)
            {
                int val;
                func1_5(i, out val);
                res1 += val;
            }
            var end1 = DateTime.Now;

            var start2 = DateTime.Now;
            int res2 = 0;
            try
            {
                for (int i = 0; i < max; i++)
                {
                    res2 += func2_5(i);
                }
            }
            catch
            {
                // do nothing
            }
            var end2 = DateTime.Now;

            return String.Format("{0}: {1} ({2}), {3} ({4})", title, end1 - start1, res1, end2 - start2, res2);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Run("test run", 1000010);

            var line1 = Run("Single exception", 1000002);
            var line2 = Run("Two exceptions", 1000003);

            System.IO.File.WriteAllLines("D:\\temp.txt", new[] { line1, line2 });
        }


Результат (Debug):
Single exception: 00:00:00.0890089 (1786293667), 00:00:00.1050105 (1785293665)
Two exceptions: 00:00:00.0950095 (1787293670), 00:00:00.1080108 (1785293665)

Результат (Release):
Single exception: 00:00:00.0430043 (1786293667), 00:00:00.0680068 (1785293665)
Two exceptions: 00:00:00.0320032 (1787293670), 00:00:00.0420042 (1785293665)


Сливают исключения, сливают.