Ada_Ru форум

Обсуждение языка Ада

Re: [ada_ru] Re: Атомарные примитивы

Оставить новое сообщение

Сообщения

kazakov1961
Re: [ada_ru] Re: Атомарные примитивы
2009-10-08 10:41:18

On Sun, 8 Nov 2009 09:01:52 +0000 (UTC), you wrote:

 

Vadim Godunko writes:

 

Не совсем понятно зачем так сложно? Можно поподробнее?

 

Вроде бы в большинстве случаев работа с объектом ведётся в

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

Отсутствие блокировок может дать прирость в 40 раз (где–то читал), но это компенсируется условными переходами, сопровождающими подсчёт ссылок. Кто в конечном счёте победит, непонятно.

 

А Вы померьте. Вот, например, сравнение голого инкремента и инкремента на protected.

 

with Ada.Real_Time; use Ada.Real_Time;

with Ada.Text_IO; use Ada.Text_IO;

 

procedure Test_Protected is

procedure Report (Text : String; Span : Time_Span; Rounds : Integer) is type Nanoseconds is delta 0.1 range -100.0..1_000_000.0;

begin

Put_Line

( Text

& Nanoseconds'Image

( Nanoseconds

( Float (To_Duration (Span)) * 1.0E9

/ Float (Rounds)

) )

& " ns"

);

end Report;

 

protected type Counter is

function Get return Integer;

procedure Inc;

procedure Dec;

private

No : Integer := 0;

end Counter;

 

protected body Counter is

function Get return Integer is

begin

return No;

end Get;

procedure Inc is

begin

No := No + 1;

end Inc;

procedure Dec is

begin

No := No - 1;

end Dec;

end Counter;

 

Rounds : constant := 100_000_000;

X : Counter;

Y : Integer := 0;

T1, T2, T3 : Time;

begin

T1 := Clock;

for I in 1..Rounds loop

X.Inc;

end loop;

T2 := Clock;

for I in 1..Rounds loop

X.Inc;

X.Inc;

end loop;

T3 := Clock;

Report ("protected increment", T3 - T2 - (T2 - T1), Rounds);

T1 := Clock;

for I in 1..Rounds loop

Y := Y + 1;

end loop;

T2 := Clock;

for I in 1..Rounds loop

Y := Y + 1;

Y := Y + 1;

end loop;

T3 := Clock;

Report ("increment", T3 - T2 - (T2 - T1), Rounds);

end Test_Protected;

 

На моем Windows 2.6GHz это (без оптимизации)

 

protected increment 91.6 ns

increment 3.7 ns

 

В осадке: 92 наносекунды, что на работе со строками эквивалентно

абсолютному нулю.

 

Далее, при разнице в 20 раз, вы должны уложиться в не более чем

приблизительно 20 дополнительных коротких операций для того, чтобы lock-free вариант оставался быстрее. Не думаю, что оно получится.

Еще дальше, разделяемые объекты, когда должны изменяться атомарно, т.е. помимо счетчика придется защищать еще что-то. Вот тут поболее 20 операций набежит.

 

Итог, дело это сложное и штучное. Каждый раз надо смотреть отдельно.

--

Regards,

Dmitry A. Kazakov

http://www.dmitry-kazakov.de

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти