Функции Raspberry Pi, Mono и Trig
Я экспериментировал с использованием Raspberry Pi в качестве синтезатора и столкнулся с действительно странным поведением. Я сделал очень простой осциллятор синусоидальной формы для тестирования и заметил, что осциллятор работает на максимуме процессора.
Мой код:
using System;
using System.Threading;
namespace OSCTest
{
class MainClass
{
public static void Main (string[] args)
{
System.Threading.Timer timer = new Timer(process, null, 1000, 1000);
Console.WriteLine ("Running.");
Console.ReadLine ();
timer.Dispose();
}
public static void process(object state)
{
for (int i = 0; i < 44100; i++)
{
float j;
j = (float)Math.Sin(2f * Math.PI * i * 1000f);
}
}
}
}
Эта простая программа полностью использует процессор RPi и многократно создает потоки для обработки входящих событий таймера таймера.
Я знал, что триггерные функции считаются довольно дорогими по сравнению с простыми математическими функциями, поэтому я вынул вычисление sin и снова запустил программу.
using System;
using System.Threading;
namespace OSCTest
{
class MainClass
{
public static void Main (string[] args)
{
System.Threading.Timer timer = new Timer(process, null, 1000, 1000);
Console.WriteLine ("Running.");
Console.ReadLine ();
timer.Dispose();
}
public static void process(object state)
{
for (int i = 0; i < 44100; i++)
{
float j;
j = (float)(2f * Math.PI * i * 1000f);
}
}
}
}
Pi даже не мигает при запуске приведенного выше примера, в буквальном смысле, top сообщает об использовании процессора на 0.0% в исполняемом файле.
Итак, мой вопрос: что вызывает экстремальное замедление? Является ли RPI неспособным хорошо вычислить грех? Это что-то особенное для моно времени выполнения на пи? Что-то еще глубже, что я не понимаю?
Изменить: преобразованные примеры кода.
1 ответ
Пожалуйста, примите во внимание тот факт, что Таймер вызывает process
функционировать каждые 1000 мс и вызывает может перекрываться, если process
функция слишком медленная, чтобы завершиться за 1000 мс.
Это может привести к переполнению процессора чрезмерным количеством потоков и замедлению работы системы.
Вы можете поставить флажок process
функция, чтобы гарантировать, что это выполнено одним потоком в любой данный момент времени.