我想检查一段代码在单线程或多线程的处理下那个的处理效率更高,这段代码可能是一个数据处理过程,我这里测试示例只是一段代码
如下:
private const int maxThread = 2; private static object lockObj = new object(); static void Main(string[] args) { Console.WriteLine("Thread Start..."); Thread thread = new Thread(Run); thread.Start(); while (thread.IsAlive) Thread.Sleep(1); Console.WriteLine("Thread End"); Console.WriteLine("Multi-thread Start..."); Thread[] threads = new Thread[maxThread]; for (int i = 0; i < maxThread; i++) { threads[i] = new Thread(Run); threads[i].Start(); } Console.WriteLine("Multi-thread End"); } private static void Run() { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); StringBuilder sb = new StringBuilder(); DataSet ds = null; sb.Append(@"SELECT TOP 10000 ID,Name FROM dbo.Tb_Test"); lock (lockObj) { ds = SqlHelper.ExecuteDataSet(ConnString, System.Data.CommandType.Text, sb.ToString(), null); if (ds.Tables[0].Rows.Count > 0) { DataRowCollection rows = ds.Tables[0].Rows; foreach (DataRow row in rows) { counter++; //Console.WriteLine("ID:" + row["ID"]); FileOperate.WriteFile("ID:" + row["ID"], "Log.txt"); } } } stopWatch.Stop(); Console.WriteLine("Cost " + stopWatch.ElapsedMilliseconds + " ms"); }
现在测试的结果
Thread Start...
Cost 14219 ms
Thread End
Multi-thread Start...
Multi-thread End
Cost 4949 ms
Cost 9803 ms
这上面看到是多线程处理的效率要快,但是我看了打印的日志,数据被打印的两次,所以我觉得多线程在这个处理上应该有什么地方不对。
同时我也不确定单线程效率低 是不是因为 锁机制导致了 单线程比多线程处理慢这么多,因为同样的CPU我觉得处理时间上不至于差那么多
为什么用多线程?那是因为可以并发。
你的代码既然用了lock,也就是不可以并发的(lock之外的代码几乎消耗为0),既然不能并发,就没必要使用多线程。
我是为了检测单线程 或 多线程处理数据时的效率!!!
既然你这样说的话,一般数据传输如果使用多线程都会有这样的问题,那基本都是用单线程来处理了
@最佳损友:
1、多线程遇到临界资源,必须用锁。
2、使用线程,可以把操作异步化,从而不需等待
3、多线程处理的目的是某些运算很消耗时间,但使用临界资源时间不很长
4、你的示例代码里,是否使用多线程,每线程都是从数据库里读取相同内容
5、你的临界资源只是文件写入操作
@519740105:
我的示例代码里,就是在使用多线程,而多线程读取的数据是每条都读取了2条,因为我开了2个线程
private const int maxThread = 2;
这里是不是也应该要用锁机制吗
我实际的项目中已经没有文件写入操作了,基本都是数据库的读取、更新、新增功能
那我这块的性能提升主要还是在数据库这里了!?
@最佳损友: 你把线程的应用误解了。