Функции 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 функция, чтобы гарантировать, что это выполнено одним потоком в любой данный момент времени.

Другие вопросы по тегам