我试图在critcl的帮助下实现一个简单的加法,我的目标是检索一个包含3个值的列表。令我感到惊讶的是,计算时间并没有大幅缩短。
减少每1.000.000 calculation.
的时间
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%的时间):
critcl::cproc quadruple {int i} int {
return i * 4;
}我是一个C语言的业余爱好者,所以我请求帮助知道我的过程critcl::cproc AddCritcl是否写得很好?如果是,在计算时间时还可以考虑其他因素吗?
在我的tcl添加过程和我的Critcl函数下面:
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;
}发布于 2021-10-18 07:53:15
很难确定额外的成本来自哪里,但这可能是由于低效率的列表构建(这是唯一与众不同的地方)。
我希望这样会更好:
// 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方面,您现在使用整数数学来计时,这不是一个公平的比较)。
https://stackoverflow.com/questions/69608374
复制相似问题