首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数学Critcl函数与数学费用

数学Critcl函数与数学费用
EN

Stack Overflow用户
提问于 2021-10-17 20:34:24
回答 1查看 84关注 0票数 1

我试图在critcl的帮助下实现一个简单的加法,我的目标是检索一个包含3个值的列表。令我感到惊讶的是,计算时间并没有大幅缩短。

减少每1.000.000 calculation.

  • ≈+100%损失的
  • ≈+25%每1.000计算

的时间

puts [time {for {set i 0} {$i < 1000} {incr i} {AddCritcl {12 0 0} {12 0 13}}} 1]

puts [time {for {set i 0} {$i < 1000} {incr i} {AddTcl {12 0 0} {12 0 13}}} 1]

puts [time {for {set i 0} {$i < 1000000} {incr i} {AddCritcl {12 0 0} {12 0 13}}} 1]

puts [time {for {set i 0} {$i < 1000000} {incr i} {AddTcl {12 0 0} {12 0 13}}} 1]

即使是这样的简单计算(每1.000.000次计算就损失了400%的时间):

代码语言:javascript
复制
critcl::cproc quadruple {int i} int {
    return i * 4; 
}

我是一个C语言的业余爱好者,所以我请求帮助知道我的过程critcl::cproc AddCritcl是否写得很好?如果是,在计算时间时还可以考虑其他因素吗?

在我的tcl添加过程和我的Critcl函数下面:

代码语言:javascript
复制
proc AddTcl {p1 p2} {
    lassign $p1 x1 y1 z1
    lassign $p2 x2 y2 z2

    set px [expr {$x1 + $x2}]
    set py [expr {$y1 + $y2}]
    set pz [expr {$z1 + $z2}]

    return [list $px $py $pz]
}

critcl::cproc AddCritcl {Tcl_Interp* interp Tcl_Obj* Pt1 Tcl_Obj* Pt2} ok {

    int i;
    double p1[3], p2[3], p[3];
    Tcl_Obj **lp;

    if (Tcl_ListObjGetElements(interp, Pt1, &i, &lp) != TCL_OK) {
        return TCL_ERROR;
    }

    if (i != 3) {
        Tcl_WrongNumArgs(interp, 2, lp, NULL);
        return TCL_ERROR;
    }

    while (i-->0) {
        if (Tcl_GetDoubleFromObj(interp, lp[i], &p1[i]) != TCL_OK) {
            return TCL_ERROR;
        }
    }

    if (Tcl_ListObjGetElements(interp, Pt2, &i, &lp) != TCL_OK) {
        return TCL_ERROR;
    }

    if (i != 3) {
        Tcl_WrongNumArgs(interp, 2, lp, NULL);
        return TCL_ERROR;
    }

    while (i-->0) {
        if (Tcl_GetDoubleFromObj(interp, lp[i], &p2[i]) != TCL_OK) {
            return TCL_ERROR;
        }
    }

    p[0] = p1[0] + p2[0];
    p[1] = p1[1] + p2[1];
    p[2] = p1[2] + p2[2];


    Tcl_Obj *Pti = Tcl_NewListObj (0,0);

    Tcl_ListObjAppendElement (interp, Pti, Tcl_NewDoubleObj(p[0]));
    Tcl_ListObjAppendElement (interp, Pti, Tcl_NewDoubleObj(p[1]));
    Tcl_ListObjAppendElement (interp, Pti, Tcl_NewDoubleObj(p[2]));

    Tcl_SetObjResult(interp, Pti);

    return TCL_OK;
}
EN

回答 1

Stack Overflow用户

发布于 2021-10-18 07:53:15

很难确定额外的成本来自哪里,但这可能是由于低效率的列表构建(这是唯一与众不同的地方)。

我希望这样会更好:

代码语言:javascript
复制
// Lots of bits the same
Tcl_Obj *outPts[3];

outPts[0] = Tcl_NewDoubleObj(p[0]);
outPts[1] = Tcl_NewDoubleObj(p[1]);
outPts[2] = Tcl_NewDoubleObj(p[2]);
Tcl_SetObjResult(interp, Tcl_NewListObj(3, outPts));
// and the end of the function is the same too

这里的优点是只有一个内存分配在堆栈外完成以创建列表。

此外,由于您关心使用浮点值,因此应该使用浮点值测试时间。这可能会产生影响(更多的是在Tcl方面,您现在使用整数数学来计时,这不是一个公平的比较)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69608374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档