static BigInteger factorial(BigInteger i)
{
if (i == 1)
{
return 1;
}
else
{
return factorial(i - 1) * i;
}
}
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start(); factorial(10000);
factorial(10000);
factorial(10000);
factorial(10000);
}
计算四次 依次执行 耗时8430毫秒 static void TestTaskFactory()
{
Task task = Task.Factory.StartNew(() =>
{
Task.Factory.StartNew(() => { factorial(10000); }, TaskCreationOptions.AttachedToParent);
Task.Factory.StartNew(() => { factorial0(10000); }, TaskCreationOptions.AttachedToParent);
Task.Factory.StartNew(() => { factorial1(10000); }, TaskCreationOptions.AttachedToParent);
Task.Factory.StartNew(() => { factorial2(10000); }, TaskCreationOptions.AttachedToParent);
});
task.Wait();
}
耗时25650
public class Factorial
{
private ManualResetEvent doneEvent;
private BigInteger big = 0; public Factorial(int n, ManualResetEvent dEvent)
{
big = (BigInteger)n;
doneEvent = dEvent;
} private BigInteger factorial(BigInteger i)
{
if (i == 1)
{
return 1;
}
else
{
return factorial(i - 1) * i;
}
} public void CallBack(Object threadContext)
{
Console.WriteLine("thread {0} started...", Thread.CurrentThread);
factorial(big);
doneEvent.Set();
}
} static void TestThreadPool()
{
ManualResetEvent[] doneEvents = new ManualResetEvent[4];
for (int i = 0; i < 4; i++)
{
doneEvents[i] = new ManualResetEvent(false);
Factorial f = new Factorial(10000, doneEvents[i]);
ThreadPool.QueueUserWorkItem(f.CallBack);
}
WaitHandle.WaitAll(doneEvents);
}
耗时 26431
为什么两种并行方式的执行时间都比串行差这么多呢?
{
if (i == 1)
{
return 1;
}
else
{
return factorial(i - 1) * i;
}
}
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start(); factorial(10000);
factorial(10000);
factorial(10000);
factorial(10000);
}
计算四次 依次执行 耗时8430毫秒 static void TestTaskFactory()
{
Task task = Task.Factory.StartNew(() =>
{
Task.Factory.StartNew(() => { factorial(10000); }, TaskCreationOptions.AttachedToParent);
Task.Factory.StartNew(() => { factorial0(10000); }, TaskCreationOptions.AttachedToParent);
Task.Factory.StartNew(() => { factorial1(10000); }, TaskCreationOptions.AttachedToParent);
Task.Factory.StartNew(() => { factorial2(10000); }, TaskCreationOptions.AttachedToParent);
});
task.Wait();
}
耗时25650
public class Factorial
{
private ManualResetEvent doneEvent;
private BigInteger big = 0; public Factorial(int n, ManualResetEvent dEvent)
{
big = (BigInteger)n;
doneEvent = dEvent;
} private BigInteger factorial(BigInteger i)
{
if (i == 1)
{
return 1;
}
else
{
return factorial(i - 1) * i;
}
} public void CallBack(Object threadContext)
{
Console.WriteLine("thread {0} started...", Thread.CurrentThread);
factorial(big);
doneEvent.Set();
}
} static void TestThreadPool()
{
ManualResetEvent[] doneEvents = new ManualResetEvent[4];
for (int i = 0; i < 4; i++)
{
doneEvents[i] = new ManualResetEvent(false);
Factorial f = new Factorial(10000, doneEvents[i]);
ThreadPool.QueueUserWorkItem(f.CallBack);
}
WaitHandle.WaitAll(doneEvents);
}
耗时 26431
为什么两种并行方式的执行时间都比串行差这么多呢?
解决方案 »
- 高手进 UDPSocket控件
- 如何遍历某个文件夹中的所有文件
- C# Winform C/S架构的文件上传、下载如何配置服务器(现金酬谢)
- datagrid行显示控制(根据行中的某一列的值,去定义此行是否显示)
- 老土的页面间传值的问题,一起讨论一下。
- 如何把DATAGRIDVIEW根据值变化cell颜色
- 如何通过.net的编译后的dll,中有注释
- 关于引入系统控件打包出错的问题。
- 字符串拼接问题~!!欢迎大家进来讨论!!
- 如何将DataGrid中的修改的数据,放到数据库中呢?
- WinForm程序怎么集成WPF程序(不是UserControl)?
- asp.net 3.5 winform求一个用chart控件做的动态曲线图实例
{
// BigInteger big = (BigInteger)data; //强制类型转换还会异常?怎么回事
factorial(10000);
} static void TestThread()
{
Thread newThread1 = new Thread(DoWork);
Thread newThread2 = new Thread(DoWork);
Thread newThread3 = new Thread(DoWork);
Thread newThread4 = new Thread(DoWork);
newThread1.Start();
newThread2.Start();
newThread3.Start();
newThread4.Start();
newThread1.Join();
newThread2.Join();
newThread3.Join();
newThread4.Join();
}
弄了4个线程 耗时25960,和线程池,和task比是相差无几。
至少我可以证明sp1234所说的Task的管理成本非常的是错误的
左右,我是三个核心的CPU,证明这几个写法都是指调用了CPU的一个核心吧,但是既然大家都是只用到了一个核心,那为什么单单连续四次顺序调用的速度最快呢?
四个线程为什么不能分布到三个核心去执行呢?这些问题挺疑惑的!
期待高人点拨一二!
PS:确实没什么分的,哪里有卖分的,本来我想去淘宝买的,没得卖
84300(你给的数据少了个零吧)=> 2565084300/3=28100
实际的数据要比28100小也是有原因的
这个原因来之指令级的并行(同一个核心可以同时执行存取指令和运算指令)你的数据,我感觉挺合理的
我的双核E2160前一种方案CPU绝对是50%,后面两种绝对是100%。
由于递归算50000!会栈溢出,我改成了循环。
算4个10000!的时候执行时间差不多,都是2300ms左右。
算4个50000!的时候并行的优势就很明显了,第一种方案23000ms左右,后面两种都是13000ms左右。