我正在尝试使用树莓派作为合成器,并遇到了一些非常特殊的行为。我制作了一个非常简单的正弦波振荡器进行测试,并注意到振荡器正在最大化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特有的单声道运行时特有的吗?是不是更深入的东西,我不理解?
编辑:改革代码示例。
答案 0 :(得分:0)
请考虑Timer每1000毫秒调用process
函数的事实,如果process
函数太慢而无法在1000毫秒内完成,则调用可能会重叠。
这会使CPU过多,导致系统运行缓慢。
您可以对process
函数进行标记检查,以确保它在任何给定的时间点由一个线程执行。