首页新闻找找看学习计划

我想检查一段代码在单线程或多线程的处理下那个的处理效率更高,但是无法确定思路是否正确?

0
悬赏园豆:5 [已解决问题] 解决于 2015-08-13 14:12

我想检查一段代码在单线程或多线程的处理下那个的处理效率更高,这段代码可能是一个数据处理过程,我这里测试示例只是一段代码
如下:

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我觉得处理时间上不至于差那么多

学无涯鲸拍浪的主页 学无涯鲸拍浪 | 初学一级 | 园豆:48
提问于:2015-04-03 12:01
< >
分享
最佳答案
0

为什么用多线程?那是因为可以并发。

你的代码既然用了lock,也就是不可以并发的(lock之外的代码几乎消耗为0),既然不能并发,就没必要使用多线程。

收获园豆:5
519740105 | 大侠五级 |园豆:5810 | 2015-04-03 12:10

我是为了检测单线程 或 多线程处理数据时的效率!!!

既然你这样说的话,一般数据传输如果使用多线程都会有这样的问题,那基本都是用单线程来处理了

学无涯鲸拍浪 | 园豆:48 (初学一级) | 2015-04-03 14:51

@最佳损友:

1、多线程遇到临界资源,必须用锁。

2、使用线程,可以把操作异步化,从而不需等待

3、多线程处理的目的是某些运算很消耗时间,但使用临界资源时间不很长

4、你的示例代码里,是否使用多线程,每线程都是从数据库里读取相同内容

5、你的临界资源只是文件写入操作

519740105 | 园豆:5810 (大侠五级) | 2015-04-03 15:24

@519740105: 

我的示例代码里,就是在使用多线程,而多线程读取的数据是每条都读取了2条,因为我开了2个线程

private const int maxThread = 2;

这里是不是也应该要用锁机制吗

我实际的项目中已经没有文件写入操作了,基本都是数据库的读取、更新、新增功能

那我这块的性能提升主要还是在数据库这里了!?

学无涯鲸拍浪 | 园豆:48 (初学一级) | 2015-04-03 17:59

@最佳损友: 你把线程的应用误解了。

519740105 | 园豆:5810 (大侠五级) | 2015-04-03 18:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册