Using VS 2010 Beta 2, I am not observing this problem.
Could you show how you implemented CollatzLength?
Well, I can't get the @#$ HTML to do the right thing so I'm attaching the entire .fs file as a zip file.
The problem is, I'm not sure attachments work :) I don't see any.
Hmm...
Maybe I just screwed up. I reedited and reattached, left the forum and came back in and it was still there so hopefully you'll be able to find it this time.
I tried this quickly on my Intel Atom netbook, and got fairly consistent numbers:
C:\temp>problem14.exe
1.478000 seconds elapsed for first
0.747000 seconds elapsed for second
(after changing the code to calculate the CollatzLength too - the attached code only benchmarks the sequence generation, I think?)
There's no benchmarking in the attached code. I've got a higher level C# function that calls my varioius Euler problem solutions and the timing is done there. Let's make sure we're on the same page - I uncomment out the line after the comment about "BAD!" and comment in the line following that one. So the only difference is whether you generate the Collatz lengths as:
Seq.initInfinite (fun i -> i) |> Seq.skip 1 |> Seq.truncate(1000000) |>Seq.map (fun i -> (i, CollatzLength i))
or as
seq {for i in 1..1000000 -> (i, CollatzLength i)}
The time goes from about 3.2 secs for the latter to 30 secs for the former as a result. Running under Windows 7 on my Sony Vaio laptop.
I tested the two sequence generators separately this time (the previous result was invalid due to the memoizing ;)), and got (Atom 1.6GHz, battery power):
Seq.initInfinite (fun i -> i) |> Seq.skip 1 |> Seq.truncate(1000000) |>Seq.map (fun i -> (i, CollatzLength i))
= 3.7s
seq {for i in 1..1000000 -> (i, CollatzLength i)}
= 2.4s
Both compiled with "fsc.exe problem14.fs" from the command line.
Okay, attached is a solution which displays the anomaly. It is a VS2010 solution - I'm runnig under beta 2 so won't work with VS 2008. It's pretty obvious what to do when you run it. There's a listbox with a single "14" in it - click on the 14 and then click on the "retrieve answer" button and the answer and a timing should appear. Go into problem14.fs and change the comment and hopefully somebody else will observe the same crazy timings that I've been seeing.
Sorry, I tried your solution, both ways, and one was about 4.8s and the other was about 5.1s - no big difference.
Are you running release mode without the debugger attached?
x86 or x64? How much RAM? (I am really grasping at straws to explain what you're seeing.)
Wow. Well, I might just have to give up on this one. I see similar timing running either debug or release. 64 bit machine with dual core. 6G RAM.
Aha! Big clue - when I run without debugging, both methods give under 4 secs running time! My formerly slow method now runs at 3.496 s and the other method at 3.408 s without a debugger attached. Curiouser and curiouser.
Ok, well there's your solution: it's the debugger.
There are a million possible things in the debugger it might be, but my hunch is it's probably something droll like in one scenario there debugger is loading some symbols/pdbs that the other scenario does not need for some reason.
It may be useful to watch the 'modules' window refreshing while the debugger is attached, as well as the status bar at the bottom of VS.
I suppose in some sense this could be considered a solution, but it's still highly mystifying to me if nobody else. 27 seconds difference for a miniscule change? I realize that there are unpredictable things going on in the debugger, but I've never seen it lengthen something by a factor of 10 in this way before. That's entirely unprecedented in my 30+ years of programming. I guess for the moment I'll chalk it up to beta software and not get too excited.
Hm, ok, I tried this on my 32-bit box with recent VS bits, and I see the same behavior. It is not something basic like symbols loading; with the debugger attached, it really is taking about 20x longer on my box when attached to a Release build. I'll continue to investigate; I assumed this would be a debugger behavior I have seen before (attaching a debugger can sometimes do all kinds of nasty wacky unpredictable stuff, I have seen VS create some weird behaviors before), but offhand this doesn't smell like any of the 'usual suspects' to me. Hm!
Couple of things I noted:
If I replace the initInfinite with
{for i in 1..1000000 -> i}
it's fast again. If I replace the Seq.map call to CollatzLength with Seq.toArray it's of neglible time. So weirdly, it seems to be the combination of initInfinite being piped into CollatzLength. I stuck in a couple of
Seq.map (fun i -> i)
into the pipeline thinking maybe that the debugger was somehow doing something on function entries, but no significant difference. I find it quite puzzling.
Yeah, we're on the trail of understanding it, there is something noteworthy going on here, I'll report back once the investigation is completed. Thanks much for discovering this and pressing on it.
Ok, it's vacation time, so hard to get all the investigating done, but briefly
On .Net 4.0, Seq.init and Seq.initInfinite use 4.0 System.Lazy under the hood. .Net 4.0's System.Lazy has some code that talks to the debugger (e.g. to warn it that trying to access .Value involves potential cross-thread synchronization and may block (e.g. if another thread is in the midst of forcing the value for the first time), and that the debugger ought not freeze up the UI if this happens). This communication between Lazy and the debugger takes a little time, and trying to run 100000 of them in a row takes a fair bit of time. :) It is unclear yet if that debugger performance aspect is avoidable (the relevant folks are mostly on vacation).
So the net for now is, if you want to avoid this, don't call Seq.init or Seq.initInfinite. You can always fake out similar behavior with functions like these
let initInfinite f =
seq { for i in 0 .. System.Int32.MaxValue do yield f i }
let init count f =
seq { for i in 0 .. (count-1) do yield f i }
Hey! Thanks for the update! I'd already made the change for the time being. Hope something can be done, but I understand if not. Good info to know, regardless!
Ah! So I'm not insane! I was beginning to wonder there for a bit. Thanks for verifying!
Well,, this has all been quite interesting. I went back and put the timing code directly into the F# "let answer =" code and get 1.5 secs for the "long" version which matches up with what everybody is seeing so the culprit would appear to be in the framework calling code which is even odder than I'd originally imagined since it just gets further and further from the two lines in question. I don't know how to explain it, but I swear on a stack of Bibles that just swapping those two lines and absolutely nothing else has this strange performance effect. Over this I have a single F# call which looks like this:
let GetAnswer (iProblem:int) =
match iProblem with
| 1 -> DAP.EulerProblems.Problem1.answer |> sprintf "%A"
| 2 -> DAP.EulerProblems.Problem2.answer |> sprintf "%A"
.
.
.
| 14 -> DAP.EulerProblems.Problem14.answer |> sprintf "%A"
.
.
.
called by the following C# code:
taskCalculate = Task.Factory.StartNew(
() =>
{
sw.Start();
string Text = CSInterface.GetAnswer(iProblem);
sw.Stop();
tbAnswer.BeginInvoke(new MethodInvoker(() =>
{
tbAnswer.Text = Text;
btnGetAnswer.Enabled = true;
lblTime.Text = (sw.ElapsedMilliseconds / 1000.0).ToString() + " Secs";
}));
taskCalculate = null;
});
It's about as straightforward as it gets, but this very strange anomaly really has me scratching my head now. Thanks for taking the time to do the timings. Sadly, as so often happens with me, learning has only made things more confusing rather than less.
I'm going to see if I can't get the actual solution in a zip file < 64k (max this forum will allow). If I can, I'll post it. Thanks again for the enlightenment.
Topic tags
- f# × 3705
- websharper × 1897
- compiler × 286
- functional × 201
- ui next × 139
- c# × 121
- classes × 97
- web × 97
- .net × 84
- book × 84
- async × 76
- ui.next × 67
- bug × 54
- core × 49
- website × 49
- server × 45
- parallel × 43
- ui × 43
- enhancement × 41
- parsing × 41
- testing × 41
- trywebsharper × 41
- typescript × 37
- html × 35
- javascript × 35
- owin × 35
- asynchronous × 30
- monad × 28
- ocaml × 28
- tutorial × 27
- warp × 27
- haskell × 26
- sitelet × 25
- linq × 22
- workflows × 22
- wpf × 20
- fpish × 19
- introduction × 19
- silverlight × 19
- sitelets × 19
- monodevelop × 17
- rpc × 17
- suave × 17
- piglets × 16
- collections × 15
- feature request × 15
- jquery × 15
- templates × 15
- getting started × 14
- pipeline × 14
- kendoui × 13
- reactive × 12
- 4.1.0.171 × 11
- monads × 11
- opinion × 10
- 4.0.190.100-rc × 9
- deployment × 9
- fixed × 9
- formlets × 9
- in × 9
- json × 9
- plugin × 9
- proposal × 9
- scheme × 9
- solid × 9
- basics × 8
- concurrent × 8
- highcharts × 8
- how-to × 8
- python × 8
- 4.1.1.175 × 7
- complexity × 7
- documentation × 7
- visual studio × 7
- 4.1.2.178 × 6
- lisp × 6
- real-world × 6
- released in 4.0.192.103-rc × 6
- remoting × 6
- resources × 6
- scala × 6
- websharper ui.next × 6
- workshop × 6
- xaml × 6
- 4.0.193.110 × 5
- 4.2.3.236 × 5
- aspnetmvc × 5
- authentication × 5
- azure × 5
- bootstrap × 5
- conference × 5
- dsl × 5
- formlet × 5
- java × 5
- list × 5
- metaprogramming × 5
- ml × 5
- released in Zafir.4.0.188.91-beta10 × 5
- sql × 5
- visualstudio × 5
- websharper.forms × 5
- zafir × 5
- 4.0.192.106 × 4
- 4.0.195.127 × 4
- 4.1.0.38 × 4
- 4.2.1.86 × 4
- 4.2.6.118 × 4
- css × 4
- example × 4
- extensions × 4
- fsi × 4
- fsx × 4
- html5 × 4
- jqueryui × 4
- lift × 4
- reflection × 4
- remote × 4
- rest × 4
- spa × 4
- teaching × 4
- template × 4
- websocket × 4
- wontfix × 4
- 4.0.196.147 × 3
- 4.1.0.34 × 3
- 4.1.6.207 × 3
- 4.2.1.223-beta × 3
- 4.2.11.258 × 3
- 4.2.4.114 × 3
- 4.2.4.247 × 3
- 4.2.5.115 × 3
- 4.2.6.253 × 3
- 4.2.9.256 × 3
- ajax × 3
- alt.net × 3
- aml × 3
- asp.net mvc × 3
- canvas × 3
- cloudsharper × 3
- compilation × 3
- database × 3
- erlang × 3
- events × 3
- extension × 3
- file upload × 3
- forums × 3
- inline × 3
- issue × 3
- kendo × 3
- macro × 3
- mono × 3
- msbuild × 3
- mvc × 3
- pattern × 3
- piglet × 3
- released in Zafir.4.0.187.90-beta10 × 3
- svg × 3
- type provider × 3
- view × 3
- 4.1.1.64 × 2
- 4.1.5.203 × 2
- 4.1.7.232 × 2
- 4.2.10.257 × 2
- 4.2.3.111 × 2
- 4.2.5.249 × 2
- android × 2
- asp.net × 2
- beginner × 2
- blog × 2
- chart × 2
- client × 2
- client server app × 2
- clojure × 2
- computation expressions × 2
- constructor × 2
- corporate × 2
- courses × 2
- cufp × 2
- d3 × 2
- debugging × 2
- direct × 2
- discriminated union × 2
- docs × 2
- elm × 2
- endpoint × 2
- endpoints × 2
- enterprise × 2
- entity framework × 2
- event × 2
- f# interactive × 2
- fable × 2
- flowlet × 2
- formdata × 2
- forms × 2
- fsc × 2
- google maps × 2
- hosting × 2
- http × 2
- https × 2
- iis 8.0 × 2
- install × 2
- interactive × 2
- interface × 2
- iphone × 2
- iteratee × 2
- jobs × 2
- jquery mobile × 2
- keynote × 2
- lens × 2
- lenses × 2
- linux × 2
- listmodel × 2
- mac × 2
- numeric × 2
- oauth × 2
- obfuscation × 2
- offline × 2
- oop × 2
- osx × 2
- packaging × 2
- pattern matching × 2
- performance × 2
- pipelines × 2
- q&a × 2
- quotation × 2
- reference × 2
- released in Zafir.4.0.185.88-beta10 × 2
- rx × 2
- script × 2
- security × 2
- self host × 2
- seq × 2
- sockets × 2
- stm × 2
- tcp × 2
- trie × 2
- tutorials × 2
- type × 2
- url × 2
- var × 2
- websharper.charting × 2
- websharper4 × 2
- websockets × 2
- wig × 2
- xna × 2
- zh × 2
- .net interop × 1
- 2012 × 1
- 4.0.194.126 × 1
- 4.1.3.184 × 1
- 4.1.4.189 × 1
- 4.2.0.214-beta × 1
- 4.2.12.259 × 1
- 4.2.2.231-beta × 1
- 4.2.8.255 × 1
- Canvas Sample Example × 1
- DynamicStyle Animated Style × 1
- Fixed in 4.0.190.100-rc × 1
- Released in Zafir.UI.Next.4.0.169.79-beta10 × 1
- SvgDynamicAttribute × 1
- WebComponent × 1
- abstract class × 1
- accumulator × 1
- active pattern × 1
- actor × 1
- addin × 1
- agents × 1
- aggregation × 1
- agile × 1
- alter session × 1
- animation × 1
- anonymous object × 1
- apache × 1
- api × 1
- appcelerator × 1
- architecture × 1
- array × 1
- arrays × 1
- asp.net 4.5 × 1
- asp.net core × 1
- asp.net integration × 1
- asp.net mvc 4 × 1
- asp.net web api × 1
- aspnet × 1
- ast × 1
- attributes × 1
- authorization × 1
- b-tree × 1
- back button × 1
- badimageformatexception × 1
- bash script × 1
- batching × 1
- binding-vars × 1
- bistro × 1
- body × 1
- bundle × 1
- camtasia studio × 1
- cas protocol × 1
- charts × 1
- clarity × 1
- class × 1
- cli × 1
- clipboard × 1
- clojurescript × 1
- closures × 1
- cloud × 1
- cms × 1
- coding diacritics × 1
- color highlighting × 1
- color zones × 1
- combinator × 1
- combinators × 1
- compile × 1
- compile code on server × 1
- config × 1
- confirm × 1
- content × 1
- context × 1
- context.usersession × 1
- continuation-passing style × 1
- coords × 1
- cordova × 1
- cors × 1
- coursera × 1
- cross-domain × 1
- csla × 1
- current_schema × 1
- custom content × 1
- data × 1
- data grid × 1
- datetime × 1
- debug × 1
- declarative × 1
- delete × 1
- devexpress × 1
- dhtmlx × 1
- dictionary × 1
- directattribute × 1
- disqus × 1
- distance × 1
- do binding × 1
- doc elt ui.next upgrade × 1
- docker × 1
- dojo × 1
- dol × 1
- dom × 1
- domain × 1
- du × 1
- duf-101 × 1
- dynamic × 1
- eastern language × 1
- eclipse × 1
- edsl × 1
- em algorithm × 1
- emacs × 1
- emotion × 1
- enums × 1
- error × 1
- etw × 1
- euclidean × 1
- eventhandlerlist × 1
- examples × 1
- ext js × 1
- extension methods × 1
- extra × 1
- facet pattern × 1
- failed to translate × 1
- fake × 1
- fantomas × 1
- fear × 1
- float × 1
- form × 1
- form-data × 1
- forum × 1
- fp × 1
- frank × 1
- fsdoc × 1
- fsharp × 1
- fsharp.core × 1
- fsharp.powerpack × 1
- fsharpx × 1
- fsunit × 1
- function × 1
- functional style × 1
- game × 1
- games × 1
- gc × 1
- generic × 1
- geometry × 1
- getlastwin32error × 1
- getting-started × 1
- google × 1
- google.maps × 1
- grid × 1
- group × 1
- guide × 1
- hash × 1
- headers × 1
- hello world example × 1
- heroku × 1
- highchart × 1
- history × 1
- how to × 1
- html-templating × 1
- http405 × 1
- httpcontext × 1
- hubfs × 1
- i18n × 1
- ie 8 × 1
- if-doc × 1
- iis × 1
- image × 1
- images × 1
- inheritance × 1
- initialize × 1
- input × 1
- install "visual studio" × 1
- installer × 1
- int64 × 1
- interfaces × 1
- internet explorer × 1
- interop × 1
- interpreter × 1
- io × 1
- iobservable × 1
- ios × 1
- iot × 1
- ipad × 1
- isomorphic × 1
- javascript optimization × 1
- javascript semanticui resources × 1
- jquery-plugin × 1
- jquery-ui × 1
- jquery-ui-datepicker × 1
- js × 1
- kendo datasource × 1
- kendochart × 1
- kendoui compiler × 1
- knockout × 1
- l10n × 1
- learning × 1
- library × 1
- libs × 1
- license × 1
- licensing × 1
- lineserieszonescfg × 1
- local setting × 1
- localization × 1
- logging × 1
- loop × 1
- macros × 1
- mailboxprocessor × 1
- mapping × 1
- maps × 1
- markerclusterer × 1
- markup × 1
- marshal × 1
- math × 1
- mathjax × 1
- message × 1
- message passing × 1
- message-passing × 1
- meta × 1
- metro style × 1
- micro orm × 1
- minimum-requirements × 1
- mix × 1
- mobile installation × 1
- mod_mono × 1
- modal × 1
- module × 1
- mouseevent × 1
- mouseposition × 1
- multidimensional × 1
- multiline × 1
- multithreading × 1
- mysql × 1
- mysqlclient × 1
- nancy × 1
- native × 1
- nested × 1
- nested loops × 1
- node × 1
- nunit × 1
- object relation mapper × 1
- object-oriented × 1
- om × 1
- onboarding × 1
- onclick × 1
- optimization × 1
- option × 1
- orm × 1
- os x × 1
- output-path × 1
- override × 1
- paper × 1
- parameter × 1
- persistence × 1
- persistent data structure × 1
- phonegap × 1
- pola × 1
- post × 1
- powerpack × 1
- prefix tree × 1
- principle of least authority × 1
- privacy × 1
- private × 1
- profile × 1
- programming × 1
- project × 1
- project euler × 1
- projekt_feladat × 1
- protected × 1
- provider × 1
- proxy × 1
- ptvs × 1
- public × 1
- pure f# × 1
- purescript × 1
- qna × 1
- quant × 1
- query sitelet × 1
- question × 1
- quotations × 1
- range × 1
- raphael × 1
- razor × 1
- rc × 1
- reactjs × 1
- real-time × 1
- ref × 1
- region × 1
- released in 4.0.190.100-rc × 1
- reporting × 1
- responsive design × 1
- rest api × 1
- rest sitelet × 1
- restful × 1
- round table × 1
- router × 1
- routing × 1
- rpc reverseproxy × 1
- runtime × 1
- sales × 1
- sample × 1
- sampleapp × 1
- scriptcs × 1
- scripting × 1
- search × 1
- self hosted × 1
- semanticui × 1
- sequence × 1
- serialisation × 1
- service × 1
- session-state × 1
- sharepoint × 1
- signals × 1
- sitelet website × 1
- sitelet.protect × 1
- sitlets × 1
- slickgrid × 1
- source code × 1
- sqlentityconnection × 1
- ssl × 1
- standards × 1
- static content × 1
- stickynotes × 1
- streamreader × 1
- stress × 1
- strong name × 1
- structures × 1
- submitbutton × 1
- subscribe × 1
- svg example html5 websharper.ui.next × 1
- sweetalert × 1
- system.datetime × 1
- system.reflection.targetinvocationexception × 1
- table storage × 1
- targets × 1
- tdd × 1
- templates ui.next × 1
- templating × 1
- text parsing × 1
- three.js × 1
- time travel × 1
- tls × 1
- tooltip × 1
- tracing × 1
- tsunamiide × 1
- turkish × 1
- twitter-bootstrap × 1
- type erasure × 1
- type inference × 1
- type providers × 1
- type-providers × 1
- typeprovider × 1
- ui next forms × 1
- ui-next × 1
- ui.next jqueryui × 1
- ui.next charting × 1
- ui.next formlets × 1
- ui.next forms × 1
- ui.next suave visualstudio × 1
- ui.next templating × 1
- unicode × 1
- unittest client × 1
- upload × 1
- usersession × 1
- validation × 1
- vb × 1
- vb.net × 1
- vector × 1
- view.map × 1
- visal studio × 1
- visual f# × 1
- visual studio 11 × 1
- visual studio 2012 × 1
- visual studio shell × 1
- vs2017 compiler zafir × 1
- vsix × 1
- web api × 1
- web-scraping × 1
- webapi × 1
- webcomponents × 1
- webforms × 1
- webgl × 1
- webrtc × 1
- webshaper × 1
- websharper async × 1
- websharper codemirror × 1
- websharper f# google × 1
- websharper forms × 1
- websharper reactive × 1
- websharper rpc × 1
- websharper sitelets routing × 1
- websharper warp × 1
- websharper-interface-generator × 1
- websharper.chartsjs × 1
- websharper.com × 1
- websharper.exe × 1
- websharper.owin × 1
- websharper.ui.next × 1
- websharper.ui.next jquery × 1
- websockets iis × 1
- why-websharper × 1
- windows 7 × 1
- windows 8 × 1
- windows-phone × 1
- winrt × 1
- www.grabbitmedia.com × 1
- xamarin × 1
- xml × 1
- yeoman × 1
- yield × 1
- zafir beta × 1
- zafir websharper4 × 1
- zarovizsga × 1
![]() |
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us | Terms of Use | Privacy Policy | Cookie Policy |
Built with WebSharper |
I have a solution to Euler Problem 14 (collatz sequence) where, depending on how I generate the sequence of numbers from 1 to 1000000, runs at either 3.4 seconds or about 30 seconds. The relevant code is:
let answer =
// The following line adds 27 secs to time to run!!! BAD!!!
// Seq.initInfinite (fun i -> i) |> Seq.skip 1 |> Seq.truncate(1000000) |>Seq.map (fun i -> (i, CollatzLength i))
seq {for i in 1..1000000 -> (i, CollatzLength i)}
|> Seq.fold (fun (ai, al) (i,l) -> if l > al then (i,l) else (ai,al)) (0, 0)
|> fst
I can post the rest if it makes any difference, but this forum seems unconducive to posting code since it removes all my indentation and has such a narrow space to enter it in. Anyway, when I saw this, I thought that the difference in speed must be in how I was generating the numbers from 1 to 1M so I did a test where I just generated the numbers in each of the two different fashions and piped them into Seq.toArray. Difference in speed: The slow method took about 0.3 secs and the fast one took about 0.1 sec.. So if the difference is solely in how they are being generated, it should be about 0.2 secs rather than 27 secs. So why do my calls to Collatzlength take 10 times longer depending on how the inputs to them are generated? Can it be some sort of caching thing? I can't imagine, but what else? Very weird.