Raspberry Pi,Mono和Trig功能

时间:2013-11-28 17:04:20

标签: c# mono arm raspberry-pi sin

我正在尝试使用树莓派作为合成器,并遇到了一些非常特殊的行为。我制作了一个非常简单的正弦波振荡器进行测试,并注意到振荡器正在最大化cpu。

我的代码:

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的cpu,并重复创建线程来处理传入的计时器滴答事件。

我知道与简单的数学函数相比,trig函数被认为是相当昂贵的,所以我拿出了罪计算并再次运行程序。

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%cpu使用率。

所以我的问题是,是什么导致极度放缓? RPi无法很好地计算罪恶吗?它是pi特有的单声道运行时特有的吗?是不是更深入的东西,我不理解?

编辑:改革代码示例。

1 个答案:

答案 0 :(得分:0)

请考虑Timer每1000毫秒调用process函数的事实,如果process函数太慢而无法在1000毫秒内完成,则调用可能会重叠。

这会使CPU过多,导致系统运行缓慢。

您可以对process函数进行标记检查,以确保它在任何给定的时间点由一个线程执行。