我有一个代码块,它从文件中读取n行,将它们加载到MySQL的临时表中,执行一些清理并与其他数据进行比较,然后根据清理结果对其他数据进行更新。 / p>
它部署为Windows服务。它一度使用多线程。它依赖于以旧式方式向MySql发出命令,执行命令和调用存储过程,而不是使用ORM(如Entity Framework)。
代码运行正常。当我在服务器上运行它而不是在调试模式下运行我的本地代码时,令我困惑的是比较性能。这就是我记录的内容:
int blockSize = 5000;
Stopwatch sw = new Stopwatch();
sw.Start();
// reads [blockSize] rows from file and appends a cleansed version to each
sw.Stop();
_log.Info(string.Format("Took {0} ms to CLEAN DATA {1} rows", sw.ElapsedMilliseconds, blockSize));
sw.Reset();
sw.Start();
// bulk copies the rows into a temp table in MySQL
sw.Stop();
_log.Info(string.Format("Took {0} ms to LOAD DATA {1} rows", sw.ElapsedMilliseconds, blockSize));
sw.Reset();
sw.Start();
// multi-threaded code which runs through the temp table and gives each record an updateId
sw.Stop();
_log.Info(string.Format("Took {0} ms to COMPARE DATA {1} rows", sw.ElapsedMilliseconds, blockSize));
sw.Reset();
sw.Start();
// executes a MySQL command to update another table using the updateId determined above
sw.Stop();
_log.Info(string.Format("Took {0} ms to SAVE DATA {1} rows", sw.ElapsedMilliseconds, blockSize));
这里有一个迭代在我的本地机器上执行的速度有多快,该机器有4个内核和8GB内存。它正在与开发MySql Server讨论数据库工作,而不是本地安装:
在相同的8核16GB RAM开发机上运行数据库时,将相同代码作为服务部署需要多长时间:
正如您所看到的,在功能更强大的机器上,比较步骤慢了38倍,而其他所有内容都略快一些。
该服务器正在努力工作,但它并没有最大化CPU或RAM或磁盘。除了普通的Windows功能之外,它在后台还没有做太多其他事情。它是一个虚拟服务器,并且它运行了这个代码的(较旧)版本,但由于据称可以使用更多内核和RAM来执行此操作,因此速度很慢。这不是一次性的:虽然这只是一组数据,但重复测试显示了类似的模式。
无法解释这里发生了什么。我只能想象它是:
之一但这些都没有多大意义。谁能提出可能的原因?或者我该如何诊断问题?