Что делает Erlang подходящим для приложений мягкого реального времени?

Давным-давно я записал модуль графика, который покрыл это приятно. Закапывание серой массы получает следующее:

  • Определяют нижнюю и верхнюю границу данных. (Остерегайтесь особого случая где нижняя граница = верхняя граница!
  • Делят диапазон на необходимое количество галочек.
  • Округляют в большую сторону диапазон галочки в хорошие суммы.
  • Корректируют нижнюю и верхнюю границу соответственно.

Позволяет, берут Ваш пример:

15, 234, 140, 65, 90 with 10 ticks
  1. нижняя граница = 15
  2. верхняя граница = 234
  3. диапазон = 234-15 = 219
  4. диапазон галочки = 21.9. Это должно быть 25.0
  5. новая нижняя граница = 25 * раунд (15/25) = 0
  6. новая верхняя граница = 25 * раунд (1+235/25) = 250

Так диапазон = 0,25,50..., 225,250

можно получить хороший диапазон галочки со следующими шагами:

  1. делятся на 10^x таким образом, что результат находится между 0,1 и 1.0 (включая 0,1, исключая 1).
  2. переводят соответственно:
    • 0.1-> 0.1
    • < = 0.2-> 0.2
    • < = 0.25-> 0.25
    • < = 0.3-> 0.3
    • < = 0.4-> 0.4
    • < = 0.5-> 0.5
    • < = 0.6-> 0.6
    • < = 0.7-> 0.7
    • < = 0.75-> 0.75
    • < = 0.8-> 0.8
    • < = 0.9-> 0.9
    • < = 1.0-> 1.0
  3. умножаются 10^x.

В этом случае, 21.9 разделен на 10^2 для получения 0.219. Это - < = 0.25, таким образом, мы теперь имеем 0.25. Умноженный на 10^2 это дает 25.

Позволяет, смотрят на тот же пример с 8 галочками:

15, 234, 140, 65, 90 with 8 ticks
  1. нижняя граница = 15
  2. верхняя граница = 234
  3. диапазон = 234-15 = 219
  4. диапазон галочки = 27.375
    1. Делится на 10^2 для 0,27375, переводит в 0,3, который дает (умноженный на 10^2) 30.
  5. новая нижняя граница = 30 * раунд (15/30) = 0
  6. новая верхняя граница = 30 * раунд (1+235/30) = 240

, Которые дают результат, который Вы запросили;-).

------Добавленный KD------

Вот код, который достигает этого алгоритма, не используя таблицы поиска, и т.д....:

double range = ...;
int tickCount = ...;
double unroundedTickSize = range/(tickCount-1);
double x = Math.ceil(Math.log10(unroundedTickSize)-1);
double pow10x = Math.pow(10, x);
double roundedTickRange = Math.ceil(unroundedTickSize / pow10x) * pow10x;
return roundedTickRange;

Вообще говоря, количество галочек включает нижнюю галочку, таким образом, фактические сегменты оси y являются тем меньше, чем количество галочек.

11
задан Carl Seleborg 27 October 2009 в 11:51
поделиться

3 ответа

Real-time code can dynamically allocate memory, it just has to be more careful about it.

In real hard real-time the dynamic memory handling will just become another of those factors which have to be taken into account when working-out whether the system can do what it has to in the time allotted. Hard is worst-case.

In soft real-time it is usually enough to check that the dynamic memory handling will not take to too much time and result in too long pauses. Soft is average case.

The erlang system just quite a good job for soft real-time apps, the dynamic memory handling is reasonably efficient and normally does not cause any noticeable pauses. And while it will probably introduce some non-determinism this in itself shouldn't you any problems. I mean that if time is important to you then you should anyway be timing the app, for example so that the audio samples "arrive" on time.

It is a completely different question if erlang is the right language for your app. One thing that has not been really optimised is numeric calculations. Erlang can of course do them but it has nowhere the speed of low-level languages. They have generally not been critical to the types of apps for which erlang has been used. But then again there is Wings 3D, an open source subdivision modeler inspired by Nendo and Mirai from Izware, which is written in erlang. So all is not hopeless. :-)

Really the only way to find out is to write a small test and try it out. Another question is what James mentioned, which type of language would you prefer to use?

10
ответ дан 3 December 2019 в 08:04
поделиться

В конце главы 1 книги Чезарини / Томпсона, которая превосходна, говорится о различии SLOC кода и телекоммуникационного приложения C ++: 85% кода C ++ - это защитное кодирование, управление памятью, высокоуровневые коммуникации, которые практически не нужны в функционально сопоставимом коде erlang.

Посмотрите, находитесь ли вы в книжном магазине или можете позаимствовать у кого-нибудь.

также читал об исследованиях приложений жесткого реального времени

http://lambda-the-ultimate.org/node/2954

http://www.scribd.com/doc/415282/05nicosi

1
ответ дан 3 December 2019 в 08:04
поделиться

Поскольку Erlang был создан Ericcson Communications для использования в телекоммуникациях, важным фактором является скорость и масштабируемость.

Вы можете прочитать эту статью о попытках подготовить Erlang к реальной работе. -time приложения, чтобы увидеть, какие проблемы им необходимо преодолеть для этого. http://lambda-the-ultimate.org/node/2954

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

Вы также можете это представляет интерес, поскольку FP будет отличаться от ООП, поэтому некоторые проблемы, с которыми вы сталкиваетесь в ООП, будут отличаться в области FP. http://blog.ribomation.com/2009/06/28/the-ups-and-downs-of-erlang/

В функциональном программировании, как только вы устанавливаете переменную, она, как правило, неизменна, поэтому вы не создаете много новых объектов. Благодаря рекурсии вы обнаружите, что у вас будет меньше переменных, поэтому сборка мусора станет более важной, что может помочь решить проблемы с памятью, которые у вас есть.

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

3
ответ дан 3 December 2019 в 08:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: