Re: Increase in efficiency with Module

*To*: mathgroup at smc.vnet.net*Subject*: [mg40059] Re: Increase in efficiency with Module*From*: atelesforos at hotmail.com (Orestis Vantzos)*Date*: Tue, 18 Mar 2003 02:21:24 -0500 (EST)*References*: <b5424l$mfr$1@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

ftauc2 is not Compiled properly. Evaluate: List@@ftauc and List@@ftauc2 All the Function[...] elements in ftauc2 mean that it is not compiled properly, hence the poor performance. The key concept is that CompiledFunctions must not refer to global symbols...everything must either be a local variable(using Module) or an argument. In the case of ftauc2, i is not a local variable or a parameter and therefore it 'taints' the compiled code. Orestis "Aaron E. Hirsh" <aehirsh at stanford.edu> wrote in message news:<b5424l$mfr$1 at smc.vnet.net>... > I would be grateful if someone could explain the difference in > efficiency between the following two simple programs. ry is a list of > length n. For n = 1000, the program using Module takes 1 second on my > laptop, whereas the program without Module takes 75 seconds. > > ftauc = Compile[{{ry, _Real, 1}, {n, _Real, 0}}, > > Module[{i, > j, a}, > > i = 1; > a = 0; > > Do[ > > > j = i + 1; > > Do[ > If[ry[[i]] < ry[[j]], a++, > If[ry[[i]] > ry[[j]], a--]]; > j++, {n - i}]; > > > i++, {n - 1}]; a > ]] > > ftauc2 = Compile[{{ry, _Real, 1}, {n, _Real, 0}}, > > > > > i = 1; > a = 0; > > Do[ > > j = i + 1; > > > Do[ > If[ry[[i]] < ry[[j]], a++, If[ry[[i]] > ry[[j]], a--]]; > > j++, {n - i}]; > > i++, {n - 1}]; a > > ] > > thank you,