我手动调整线程数:
if (items.Count == 0) { threads = 0; }
else if (items.Count < 1 * hundred) { threads = 1; }
else if (items.Count < 3 * hundred) { threads = 2; }
else if (items.Count < 5 * hundred) { threads = 4; }
else if (items.Count < 10 * hundred) { threads = 8; }
else if (items.Count < 20 * hundred) { threads = 11; }
else if (items.Count < 30 * hundred) { threads = 15; }
else if (items.Count < 50 * hundred) { threads = 30; }
else threads = 40;
我需要一个返回必要/优化线程数的函数。
好的,现在忘了上面。我需要绘制曲线图。我给出了坐标,功能图曲线。想象一下点(0,0)和点(5,5)-in(x,y)形式。它应该是直线的。那么我可以测量x为y = 3。
如果我给出分数(0,0),(2,3),(8,10),(15,30)和(30,50)会发生什么。这将是一个像曲线一样的东西。现在我可以计算给定y的x,反之亦然吗?
我想你明白了。我应该使用MathLab还是可以在C#中完成?
答案 0 :(得分:3)
您正在寻找curve fitting,或者是从一组数据点描述曲线的函数的推导。如果您希望这样做一次,从一组恒定的数据中,Matlab就可以完成这项工作。如果你想动态地这样做,那里有库和算法。
查看关于linear regression的维基百科文章。该文章中提到的最小二乘方法非常常见。环顾四周,你会发现libraries和code samples使用这种方法。
答案 1 :(得分:1)
您可以通过重新排序测试(并使用嵌套的if)来加快运行速度。但这不是一个平滑的功能,不太可能有任何简单的描述。
或者你是否想找到一个在这些点附近通过的平滑函数?
答案 2 :(得分:1)
你可以使用线性回归;你会得到这样的东西:
所以我可能会用C#对它进行编码:
int threads = (int) Math.Ceiling(0.0056*items.Count + 0.5);
我使用Math.Ceiling
来确保当输入不为0时你不会得到0.当然,即使输入 0,这个函数也会给你1;如果重要,您可以随时将其视为特例,或者使用Math.Round
代替。
然而,这意味着线程数将持续增加。它不会在40级达到平衡。如果这是你想要的,你可能需要研究不同类型的回归。