我有一个非常慢的应用程序,在Windows CE / WindowsMobile 6.1中没有明显的原因,应用程序使用线程很简单,我试图调查这是问题的原因,我写了一个简单的程序:< / p>
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace SmartDeviceProject6
{
class Program
{
static void Main(string[] args)
{
DateTime mtStart = DateTime.Now;
System.Diagnostics.Debug.WriteLine("{0} MainThread - START", mtStart.ToString("MM/dd/yyyy hh:mm:ss.fff tt"));
System.Diagnostics.Debug.WriteLine("Main Thread - Starts Here!");
Thread t = new Thread(WriteY); // Kick off a new thread
t.Start(); // running WriteY()
// Simultaneously, do something on the main thread.
for (int i = 0; i < 250; i++)
{
Console.Write("x");
System.Diagnostics.Debug.WriteLine("x");
System.Diagnostics.Debug.WriteIf(i == 249, "X is OVER");
if (i == 50)
{
System.Diagnostics.Debug.WriteLine("MAIN - sleep");
//Thread.Sleep(1000);
}
}
DateTime mtEnd = DateTime.Now;
System.Diagnostics.Debug.WriteLine("{0} MainThread - END", mtEnd.ToString("MM/dd/yyyy hh:mm:ss.fff tt"));
}
static void WriteY()
{
DateTime wtStart = DateTime.Now;
System.Diagnostics.Debug.WriteLine("{0} WorkerThread - START", wtStart.ToString("MM/dd/yyyy hh:mm:ss.fff tt"));
System.Diagnostics.Debug.WriteLine("Worker Thread - Starts Here!");
for (int i = 0; i < 250; i++)
{
Console.Write("Y");
System.Diagnostics.Debug.WriteLine("Y");
System.Diagnostics.Debug.WriteIf(i == 249, "Y is OVER");
if (i == 100)
{
System.Diagnostics.Debug.WriteLine("HIT - 100!!!");
//Thread.Sleep(500);
}
}
DateTime wtEnd = DateTime.Now;
System.Diagnostics.Debug.WriteLine("{0} WorkerThread - END", wtEnd.ToString("MM/dd/yyyy hh:mm:ss.fff tt"));
}
}
}
这是输出:
'SmartDeviceProject6.exe'(托管):已加载'C:\ Program 文件\ Microsoft.NET \ SDK \ CompactFramework \ v3.5版本\调试\ BCL \ mscorlib.dll中” 'SmartDeviceProject6.exe'(托管):已加载 'c:\ users \ icreate \ documents \ visual studio 2008 \项目\ smartdeviceproject6 \ smartdeviceproject6 \ BIN \调试\ SmartDeviceProject6.exe”, 符号已加载。 'SmartDeviceProject6.exe'(托管):已加载 “C:\ PROGRAM 文件\ Microsoft.NET \ SDK \ CompactFramework \ v3.5版本\调试\ BCL \ System.dll中” 12/06/2012 01:02:36.000 PM:{0} MainThread - START主线程 - 从这里开始! x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x MAIN - 睡眠x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x X是OVER12 / 06/202012 01:02:38.000 PM: {0} MainThread - END线程0xf6b1b7d6已退出,代码为0 (为0x0)。 12/06/2012 01:02:38.000 PM:{0} WorkerThread - START Worker 线程 - 从这里开始! Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y. Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y HIT - 100 !!! Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y. Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y 是Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y是OVER12 / 06/2012 01:02:38.000 PM:{0} WorkerThread - END线程0x36be0f96具有 退出代码0(0x0)。线程0xd7be774a已退出,代码为0 (为0x0)。程序'[0xF7D3F6F6] SmartDeviceProject6.exe:Managed'有 退出代码0(0x0)。
有两件事困扰我......
1)是没有明显的线程正在进行...所有的X都被打印然后所有的Ys,如果我睡觉我可以交错代码,但似乎没有多线程正在进行...
2)这些是一些非常简单的for循环,它们不应该花费一秒钟来运行。
有没有人知道WinMobile 6.1是否支持正确的线程化?我应该使用不同的线程模型吗?我该怎么做才能加快速度?
答案 0 :(得分:3)
您看到的“缓慢”与调试器连接有关。 Debug.Writeline
是同步且缓慢的(Console.Writeline
也不是那么快)。例如,我将它们移除并计数到2500(因此比测试大10倍)在两个循环中,在我面前的PXA270设备上只需要大约80ms。即使写入文件也不会对速度产生影响。
我确实看到了相同的“所有其他线程然后所有其他线程”,当我没有屈服的时候跑出来,但我不能说我太惊讶了。两个线程都具有相同的优先级,并且线程量子很可能是原因 - 如果你运行了更多的迭代,你就会达到量子限制并且调度程序会交换。我在每个循环中输入Thread.Sleep(0)
,这使得输出更像你期望的那样,并且时间仅增加到大约180ms以运行到2500(线程上下文切换是减速)。
static void Main(string[] args)
{
Debug.WriteLine("Start");
var writer = File.CreateText("\\test.txt");
var start = Environment.TickCount;
var are = new AutoResetEvent(false);
var t = new Thread(delegate
{
for (int i = 0; i < 2500; i++)
{
writer.Write(".");
Thread.Sleep(0);
}
// set an event signaling completion
are.Set();
});
t.Start();
for (int i = 0; i < 2500; i++)
{
writer.Write("+");
Thread.Sleep(0);
}
var et = Environment.TickCount - start;
Debug.WriteLine(string.Format("\r\nET: {0}ms", et));
// wait for the thread to complete
are.WaitOne();
// this would also work
// t.Join();
writer.Close();
using(var reader = File.OpenText("\\test.txt"))
{
var content = reader.ReadToEnd();
Debug.WriteLine(content);
}
}