Download - Beyond lists - Copenhagen 2015
![Page 1: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/1.jpg)
Login details
type Wifi =
| Cook1
| Cook2
| Cook3
with
member wifi.Password =
"Simcorp1"
Maslow’s Heircharchy of Needs
![Page 2: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/2.jpg)
Phillip Trelford, @ptrelford
Copenhagen 2015, @SimCorp
![Page 3: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/3.jpg)
LAMP Stack (State in DB) 3-Tier (State in memory & DB)
![Page 4: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/4.jpg)
Source: http://blog.codinghorror.com/the-infinite-space-between-words/
![Page 6: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/6.jpg)
[Google found that] the page with 10 results took 0.4 seconds to generate. The page with 30 results took 0.9 seconds. Half a second delay caused a 20% drop in traffic. Half a second delay killed user satisfaction.
In A/B tests, [Amazon] tried delaying the page in increments of 100 milliseconds and found that even very small delays would result in substantial and costly drops in revenue.
Source: http://blog.codinghorror.com/performance-is-a-feature/
![Page 8: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/8.jpg)
Source: http://trelford.com/blog/post/C2b2b-vs-C-vs-F-vs-Haskell.aspx
![Page 9: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/9.jpg)
Micro
Fast
Simple
Quick(*)
Reactive
Web
Scalable
Mongo
Framework
Lite
Light
Domain
Extensions
Cache
XML
ORM
![Page 10: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/10.jpg)
Phillip Trelford, @ptrelford
Copenhagen 2015, @SimCorp
![Page 11: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/11.jpg)
type 'a list =
| Empty
| Node of head:'a * tail:'a list
6 2 7 3 nil
![Page 12: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/12.jpg)
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smallerSorted = quicksort [a | a <- xs, a <= x]
biggerSorted = quicksort [a | a <- xs, a > x]
in smallerSorted ++ [x] ++ biggerSorted
* well it’s short and a sort but it’s not
quick!
Source: http://learnyouahaskell.com/recursion
![Page 13: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/13.jpg)
![Page 14: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/14.jpg)
“people are too puritanical about purity”- Jon Harrop on Quora
![Page 15: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/15.jpg)
Phillip Trelford, @ptrelford
Copenhagen 2015, @SimCorp
![Page 16: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/16.jpg)
![Page 17: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/17.jpg)
LinqOptimizer compiles declarative
LINQ queries into fast loop-based
imperative code. The compiled code
has fewer virtual calls and heap
allocations, better data locality and
speedups of up to 15x
![Page 18: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/18.jpg)
Phillip Trelford, @ptrelford
Copenhagen 2015, @SimCorp
![Page 19: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/19.jpg)
![Page 20: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/20.jpg)
![Page 21: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/21.jpg)
Reactive Extensions (C#) F# Observable module Nessos Streams
let rxValue =
data
.ToObservable()
.Where(fun x -> x%2L = 0L)
.Select(fun x -> x * x)
.Sum()
.ToEnumerable()
|> Seq.head
// Real: 00:00:02.895,
CPU: 00:00:02.843,
GC gen0: 120, gen1: 0, gen2: 0
let obsValue =
data
|> Observable.ofSeq
|> Observable.filter (fun x -> x%2L = 0L)
|> Observable.map (fun x -> x * x)
|> Observable.sum
|> Observable.first
// Real: 00:00:00.479,
CPU: 00:00:00.468,
GC gen0: 18, gen1: 0, gen2: 0
let streamValue =
data
|> Stream.ofArray
|> Stream.filter (fun x -> x%2L =
0L)
|> Stream.map (fun x -> x * x)
|> Stream.sum
// Real: 00:00:00.130,
CPU: 00:00:00.109,
GC gen0: 0, gen1: 0, gen2: 0
![Page 22: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/22.jpg)
Be scientific
Do test multiple implementations
Don’t set out to confirm your bias
Instrument and profile your code
![Page 23: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/23.jpg)
Phillip Trelford, @ptrelford
Copenhagen 2015, @SimCorp
![Page 25: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/25.jpg)
HybridDictionary attempts to optimize Hashtable.
It implements a linked list and hash table data structure, switching over to the second from the first when the number of elements increases past a certain threshold.
https://www.simple-talk.com/blogs/2011/10/21/some-non-generic-collections/
![Page 26: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/26.jpg)
Source: http://www.timestored.com/kdb-guides/kdb-database-intro
![Page 27: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/27.jpg)
Phillip Trelford, @ptrelford
Copenhagen 2015, @SimCorp
![Page 28: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/28.jpg)
String representation Insert Plan Length vs Median Time
Source: http://www.ibm.com/developerworks/library/j-ropes/
![Page 29: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/29.jpg)
A linked-list of arrays
![Page 30: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/30.jpg)
A tree of arrays
![Page 31: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/31.jpg)
![Page 32: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/32.jpg)
[the B+ tree] is one of the most beautiful and useful inventions of computer science, with significance to
civilization rivalling the invention of the arch, double entry accounting, and arabic numerals
Source: http://bplusdotnet.sourceforge.net/
![Page 33: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/33.jpg)
Phillip Trelford, @ptrelford
Copenhagen 2015, @SimCorp
![Page 34: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/34.jpg)
Prefer safetyImmutable data structures
Or hide state behind immutable interface
Assume nothing – profile everything
Be pragmatic
![Page 35: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/35.jpg)
@ptrelford
Blog
http://trelford.com/blog
Unrolled linked list in OCaml
http://github.com/ptrelford/Unrolled
![Page 36: Beyond lists - Copenhagen 2015](https://reader034.vdocuments.site/reader034/viewer/2022052117/58edcea71a28ab42368b46b5/html5/thumbnails/36.jpg)