Сообщение 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 реализованы.

Так сойдет?
Результат:
Single exception: 00:00:00.0890089 (1786293667), 00:00:00.1050105 (1785293665)
Two exceptions: 00:00:00.0950095 (1787293670), 00:00:00.1080108 (1785293665)
Сливают исключения, сливают.
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 реализованы.

Так сойдет?
Результат (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)
Сливают исключения, сливают.
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)
Сливают исключения, сливают.