矛盾的计时功能(Paradoxal timing functions)
我有一个函数来计算块中花费的时间:
import collection.mutable.{Map => MMap} var timeTotalMap = MMap[String, Long]() var numMap = MMap[String, Float]() var averageMsMap = MMap[String, Float]() def time[T](key: String)(block: =>T): T = { val start = System.nanoTime() val res = block val total = System.nanoTime - start timeTotalMap(key) = timeTotalMap.getOrElse(key, 0L) + total numMap(key) = numMap.getOrElse(key, 0f) + 1 averageMsMap(key) = timeTotalMap(key)/1000000000f/numMap(key) res }
我正在计算一个函数以及在一个地方调用它的地方。
time("outerpos") { intersectPos(a, b) }
并且函数本身以:
def intersectPos(p1: SPosition, p2: SPosition)(implicit unify: Option[Identifier] =None): SPosition = time("innerpos") {(p1, p2) match { ... }
当我为每个键显示纳米时间(
timeTotalMap
)时,我得到(为lisibility添加空格)outerpos-> 37 870 034 714 innerpos-> 53 647 956
这意味着innerpos的总执行时间比外包的总执行时间少1000。
什么 ! 两者之间有一个因素1000? 它说外部呼叫比所有内部功能多花费1000倍? 我错过了什么,或者某处是否存在泄漏鬼魂?
更新
当我比较每个块的执行次数(
numMap
)时,我发现以下内容:outerpos -> 362878 innerpos -> 21764
这是矛盾的。 即使在其他地方调用
intersectPos
,它的调用次数是否应该与外部调用的次数一样大?编辑
如果我将行
numMap(key) = numMap.getOrElse(key, 0f) + 1
到时间函数的顶部,那么这些数字大致相等。I have a function to compute the time spent in a block:
import collection.mutable.{Map => MMap} var timeTotalMap = MMap[String, Long]() var numMap = MMap[String, Float]() var averageMsMap = MMap[String, Float]() def time[T](key: String)(block: =>T): T = { val start = System.nanoTime() val res = block val total = System.nanoTime - start timeTotalMap(key) = timeTotalMap.getOrElse(key, 0L) + total numMap(key) = numMap.getOrElse(key, 0f) + 1 averageMsMap(key) = timeTotalMap(key)/1000000000f/numMap(key) res }
I am timing a function and the place where it is called in one place.
time("outerpos") { intersectPos(a, b) }
and the function itself starts with:
def intersectPos(p1: SPosition, p2: SPosition)(implicit unify: Option[Identifier] =None): SPosition = time("innerpos") {(p1, p2) match { ... }
When I display the nano times for each key (
timeTotalMap
), I get (added spaces for lisibility)outerpos-> 37 870 034 714 innerpos-> 53 647 956
It means that the total execution time of innerpos is 1000 less than the one of outerpos.
What ! there is a factor 1000 between the two ? And its says that the outer call takes 1000x more time than all the inner functions? am I missing something or is there a memory leaking ghost somewhere ?
Update
When I compare the number of execution for each block (
numMap
), I find the following:outerpos -> 362878 innerpos -> 21764
This is paradoxal. Even if
intersectPos
is called somewhere else, shouldn't the number of times it is called be as great as the number of times outerpos is called?EDIT
If I move the line
numMap(key) = numMap.getOrElse(key, 0f) + 1
to the top of the time functinon, then these numbers become approximately equal.
原文:https://stackoverflow.com/questions/21241079
最满意答案
你的
const
类型和我的完全一样。 为了清晰起见,我只分解了很多部分。 我唯一添加的新类型是selectorFuncWrapper
,我认为它就是你正在寻找的。原始代码被保留。 检查它是否适合你。
type selector<H, T> = (head: H, tail: T) => (H | T); type selectorFunc<H, T> = (selector: selector<H, T>) => (H | T); type consFunc<H, T> = (head: H, tail: T) => selectorFunc<H, T>; type selectorFuncWrapper<H, T> = (list: selectorFunc<H, T>) => selectorFunc<H, T>; const cons: consFunc<number, any> = (head, tail) => selector => selector(head, tail); const head: selectorFuncWrapper<number, any> = list => list((head, tail) => head); const rest: selectorFuncWrapper<number, any> = list => list((head, tail) => tail); let someList = cons(1, cons(2, cons(3, null))); head(someList); // returns: 1 rest(someList); // returns: cons(2, cons(3, null))
Your
const
type is exactly the same as mine. I just split the many parts for clarity. The only new type I have added is theselectorFuncWrapper
, which I think is what you were looking for.The original code is preserved. Check if it is good for you.
type selector<H, T> = (head: H, tail: T) => (H | T); type selectorFunc<H, T> = (selector: selector<H, T>) => (H | T); type consFunc<H, T> = (head: H, tail: T) => selectorFunc<H, T>; type selectorFuncWrapper<H, T> = (list: selectorFunc<H, T>) => selectorFunc<H, T>; const cons: consFunc<number, any> = (head, tail) => selector => selector(head, tail); const head: selectorFuncWrapper<number, any> = list => list((head, tail) => head); const rest: selectorFuncWrapper<number, any> = list => list((head, tail) => tail); let someList = cons(1, cons(2, cons(3, null))); head(someList); // returns: 1 rest(someList); // returns: cons(2, cons(3, null))
相关问答
更多-
TCP/IP模型是一个________。[2023-10-02]
a -
如何为cons单元生成一个通用的TypeScript类型签名?(How to generate a generic TypeScript type signature for a cons cell?)[2021-11-10]
你的const类型和我的完全一样。 为了清晰起见,我只分解了很多部分。 我唯一添加的新类型是selectorFuncWrapper ,我认为它就是你正在寻找的。 原始代码被保留。 检查它是否适合你。 type selector= (head: H, tail: T) => (H | T); type selectorFunc = (selector: selector ) => (H | T); type consFunc = (head: H, tail: ... -
下列中不属于面向对象的编程语言的是?[2022-05-30]
a -
以下似乎有效,但我尚未有时间证明它满足所有可能的情况: interface NestableCell
extends ObsCell > {} interface FlattenableRX extends ObsArray< T | NestableCell | FlattenableRX > | FlattenableJS | FlattenableRX > {} ... -
正确和不正确的列表没有在类型级别上定义。 这将需要递归类型定义,这只能在satisfies类型的Lisp下进行,并且在这种情况下, type-of仍然不会返回复杂的类型说明符: 湾 返回的类型不涉及and , eql , member , not , or satisfies或values 。 list类型可以定义为(or cons null) : 类型cons和null构成类型list的详尽分区。 这意味着nil是一个列表,任何cons单元都是一个列表。 另请参阅listp的定义。 换一种说法: (typ ...
-
您有问题的声明看起来像是在尝试创建一个通用变量 ,但是TypeScript(从v2.5开始)没有那些。 TypeScript具有泛型类型 ,这就是ComposeMapper
类型,并且它具有泛型函数 ,这是您的上一个_cm声明。 无论如何,我对你的打字感到困惑。 Mappable是一个带有泛型函数map()的接口,它返回map()调用者指定的任何类型T ? 如何实施? 你想要的泛型变量似乎返回值 T ,它只是一个类型 ,所以无论如何这将是一个语法错误。 最后一行,你调用m.map(f) ,其中m是T , ... -
原因是lib.d.ts和clearWatch在Geolocation界面中都有一个名为clearWatch的方法。 我建议你从phonegap.d.ts中注释掉这个方法 The reason for this is both lib.d.ts and phonegap.d.ts has a method called clearWatch in the Geolocation interface. I suggest you to comment out this method from phonegap. ...
-
之前可以(_:any[]) => any[] 如果要在函数签名中对返回类型进行编码,请执行以下操作: function wrap(fn, before, after) : Function { ...function... } before could be (_:any[]) => any[] If you want to encode the return type in your function signature just do something like this: function wr ...
-
看起来两者的签名是不同的: Array.find : find( predicate: (value: T, index: number, obj: Array
) => boolean, thisArg?: any ): T | undefined; List.find : find( predicate: (value?: V, key?: K, iter?: /*this*/Iterable ) => boolean, context?: any, ... -
这就是我要做的: module Factory { export function createInstance
(ctor: { new (raw: K): T }, data: K): T { return new ctor(data); } } var raw1 = { Foo: "foo" } as IRaw1; var d1 = Factory.createInstance(Wibble, raw1 ...