微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当数据计算逐渐变长时,c ++ 创建剩余时间估计?

如何解决当数据计算逐渐变长时,c ++ 创建剩余时间估计?

我正在向列表中添加项目,因此每次插入所需的时间都比上一次长一点(这是一项要求,假设您无法更改)。我已经在我的计算机上手动为示例数据集计时,但我想要一种通用的方法来预测任何计算机上的时间,并给定任何数据集大小。

在我试图弄清楚这一点的过程中,我收集了一个向量,长度为 100,表示“样本数据的 1/100”花费了多长时间。因此,在我的示例数据集中,我有 237,965 个对象,这意味着在我收集的时间向量中,每个桶都说明添加 2,379 个项目需要多长时间。

这是 100 个项目的 link to the sample data。所以你可以看到前 2k 项花费了大约 8 秒,最后 2k 项花费了大约 101 秒。加在一起,如果你把所有的时间加起来,那就是 4,295 秒或大约 1 小时 11 分钟。

所以我的问题是,给定这个数据集,并将其用于未来的预测,我如何估计添加不同大小数据时的剩余时间?

更进一步,我做了一些情节,想知道它是否有帮助。第一个图只是日志图上的原始数据:

raw data

然后我根据第一个数据集制作了第二个数据集,这次显示的是累积时间,而不仅仅是当前切片的时间,并将其绘制在线性图上:

linear graph

注意到可爱的趋势线公式了吗?这一定是我需要以某种方式插入我的代码的东西,但我终生无法弄清楚如何。

我应该将数据收集到时间片而不是索引片中吗?即:我知道这个数据需要 1:10 来加载,所以每 1/100 的持续时间拍摄快照,而不是每 1/100 的数据集快照?

或者我如何解决这个问题?

我需要写的函数有这个API:

CFTimeInterval      get_estimated_end_time(int maxI,int curI,CFTimeInterval elapsedT);

因此仅给出这三个变量(maxI、curI 和 elapsedT),并且知道上面的趋势线公式,我需要返回“直到 maxI 的持续时间”(秒)。

有什么想法吗?

更新:

好吧,经过一番折腾,我可以这样做(注意“LERP”只是线性插值):

#define         kDataSetMax     237965

double          FunctionX(int in_x)
{
    double      _x(LERP(0,100,in_x,i_maxI));

    double      resultF =
          (0.32031139888898874  * math_square(_x))
        + (9.609731568497784    * _x)
        - (7.527252350031663);

    if (resultF <= 1) {
        resultF = 1;
    }

    return resultF;
}


CFTimeInterval  get_estimated_end_time(int maxI,CFTimeInterval elapsedT)
{
    CFTimeInterval      endT(FunctionX(maxI));

    return remainingT;
}

但这意味着我只是忽略 curIelapsedT??这似乎不是……对吧?我错过了什么?

脚注:

#define     LERP(to_min,to_max,from,from_min,from_max)  \
    ((from_max) == (from_min) ? from :                      \
    (double)(to_min) + ((double)((to_max) - (to_min))       \
        * ((double)((from) - (from_min))                    \
        / (double)((from_max) - (from_min)))))

#define     LERP_PERCENT(from,from_max) \
    LERP(0.0f,1.0f,0.0f,from_max)

解决方法

您的 FunctionX 大部分都在那里。目前正在计算 expectedTimeToReachMaxIOnMyMachine。您需要做的是找出当前时间相对于您机器上达到同一点的预期时间慢了多少,然后将相同的比率外推到最大时间。

CFTimeInterval get_estimated_end_time(int maxI,int curI,CFTimeInterval elapsedT) {
    //calculate how long we expected it to take to reach this point
    CFTimeInterval expectedTimeToReachCurrentIOnMyMachine = FunctionX(curI);
    //calculate how much slower we are than the expectation
    //if this machine is faster,the math still works out.
    double slowerThanExpectedByRatio 
            = double(elapsedT) / expectedTimeToReachCurrentIOnMyMachine;
    
    //calculate how long we expected to reach the max
    CFTimeInterval expectedTimeToReachMaxIOnMyMachine = FunctionX(maxI);
    //if we continue to be the same amount slower,we'll reach the max at:
    CFTimeInterval estimatedTimeToReachMaxI 
            = expectedTimeToReachMaxIOnMyMachine * slowerThanExpectedByRatio;
    return estimatedTimeToReachMaxI;
}

请注意,智能实现可以缓存和重用 expectedTimeToReachMaxIOnMyMachine,而不是每次都计算它。

基本上,这假设在完成 X% 的工作后,我们可以计算出我们比预期曲线慢了多少,并假设我们将比预期曲线慢多少。

在下面的示例中,预计花费的时间是蓝线。在 4000 个元素时,我们看到在您的机器上的预期时间为 8,055,826,但在这台机器上实际花费的时间为 10,472,573,高出 30% (slowerThanExpectedByRatio=1.3)。到那时,我们可以推断在整个过程中我们可能会保持高出 30%(紫色线)。因此,如果您的机器上 10000 个元素的总预期时间为 32,127,229,那么我们在这台机器上 10000 的总估计时间将为 41,765,398(高 30%) enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。