Racing C#initial = 100
+1
101
-2
99
+3
102
-4
98
+5
103
-6
97
+7
104
-8
96
+9
105
-10
95
+11
106
-0
100
Racing C#initial = 100
+1
101
-2
99
+3
102
-4
98
+5
103
-6
97
+7
104
-8
96
+9
105
-10
95
+11
106
-12
94
-0
100
Racing C#initial = 100
+1
101
-2
99
+3
102
-4
98
+5
103
-6
97
+7
104
-8
96
+9
105
-10
95
+11
106
-12
94
+13
107
-0
100
Racing C#initial = 100
+1
101
-2
99
+3
102
-4
98
+5
103
-6
97
+7
104
-8
96
+9
105
-10
95
+11
106
-12
94
+13
107
-14
93
-0
100
Racing C#[44006:6972073][2015-08-10T22:14:23.5812750Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 0 [44006:6972073][2015-08-10T22:14:23.5812830Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 1 [44006:6972073][2015-08-10T22:14:23.5812890Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 2 [44006:6972073][2015-08-10T22:14:23.5812940Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 3 [44006:6972073][2015-08-10T22:14:23.5812990Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 4 [44006:6972073][2015-08-10T22:14:23.5813050Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 5 [44006:6972073][2015-08-10T22:14:23.5813110Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 6 [44006:6972073][2015-08-10T22:14:23.5813160Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 7 [44006:6972073][2015-08-10T22:14:23.5813200Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 8 [44006:6972073][2015-08-10T22:14:23.5813260Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 9 [44006:6972073][2015-08-10T22:14:23.5813310Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 10 [44006:6972073][2015-08-10T22:14:23.5813360Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 11 [44006:6972073][2015-08-10T22:14:23.5813400Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 12 [44006:6972073][2015-08-10T22:14:23.5813450Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 13 [44006:6972073][2015-08-10T22:14:23.5813500Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 14 [44006:6972073][2015-08-10T22:14:23.5813610Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L146]: -> 93
Racing C#initial = 100
-2
102
+7
104
+5
103
-6
97
-0
100
+11
104
-8
96
+1
101
-10
93
+3
104
+9
113
-4
98
Racing C#initial = 100
-2
102
+7
104
+5
103
-6
97
-0
100
+11
104
-8
96
+1
101
-10
93
+3
104
-12
84
+9
113
-4
98
Racing C#initial = 100
-2
102
+7
104
+5
103
-6
97
-0
100
+11
104
-8
96
+1
101
-10
93
+3
104
+13
97
-12
84
+9
113
-4
98
Racing C#initial = 100
-2
102
+7
104
+5
103
-6
97
-0
100
+11
104
-8
96
+1
101
-10
93
+3
104
+13
97
-12
84
+9
113
-14
83
-4
98
Racing C#[44006:6972073][2015-08-10T22:14:23.5816070Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 0 [44006:6972073][2015-08-10T22:14:23.5816250Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 1 [44006:6972073][2015-08-10T22:14:23.5816310Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 3 [44006:6972073][2015-08-10T22:14:23.5816310Z][DBUG00009][ViewModels.RaceLoggingViewModel.Run L138]: 2 [44006:6972073][2015-08-10T22:14:23.5816360Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 4 [44006:6972073][2015-08-10T22:14:23.5816410Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 5 [44006:6972073][2015-08-10T22:14:23.5816460Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 6 [44006:6972073][2015-08-10T22:14:23.5816500Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 7 [44006:6972073][2015-08-10T22:14:23.5816550Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 9 [44006:6972073][2015-08-10T22:14:23.5816600Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 10 [44006:6972073][2015-08-10T22:14:23.5816640Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 11 [44006:6972073][2015-08-10T22:14:23.5816680Z][DBUG00009][ViewModels.RaceLoggingViewModel.Run L138]: 8 [44006:6972073][2015-08-10T22:14:23.5816690Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 12 [44006:6972073][2015-08-10T22:14:23.5816740Z][DBUG00010][ViewModels.RaceLoggingViewModel.Run L138]: 13 [44006:6972073][2015-08-10T22:14:23.5816910Z][DBUG00009][ViewModels.RaceLoggingViewModel.Run L138]: 14 [44006:6972073][2015-08-10T22:14:23.5817100Z][DBUG00009][ViewModels.RaceLoggingViewModel.Run L146]: -> 92
Accidental LocksI/O operations using [System.Console] are synchronized, which means multiple threads
can read from, or write to, the streams.
Accidental LocksI/O operations using [System.Console] are synchronized, which means multiple threads
can read from, or write to, the streams.
https://github.com/dotnet/corefx/blob/master/src/System.Console/src/System/IO/SyncTextWriter.cs
TPL Dataflow
ActionBlock<T>
TransformBlock<T, U>
TransformManyBlock<T, U>
BatchBlock<T>
JoinBlock<T, U, …>
BatchedJoinBlock<T, U, …>
TPL Dataflow
ActionBlock<T>
TransformBlock<T, U>
TransformManyBlock<T, U>
BufferBlock<T>
WriteOnceBlock<T>
BroadcastBlock<T>
BatchBlock<T>
JoinBlock<T, U, …>
BatchedJoinBlock<T, U, …>
Exec
utio
n
TPL Dataflow
ActionBlock<T>
TransformBlock<T, U>
TransformManyBlock<T, U>
BufferBlock<T>
WriteOnceBlock<T>
BroadcastBlock<T>
BatchBlock<T>
JoinBlock<T, U, …>
BatchedJoinBlock<T, U, …>
Gro
upin
g
Exec
utio
n
TPL Dataflow
ActionBlock<T>
TransformBlock<T, U>
TransformManyBlock<T, U>
BufferBlock<T>
WriteOnceBlock<T>
BroadcastBlock<T>
BatchBlock<T>
JoinBlock<T, U, …>
BatchedJoinBlock<T, U, …>
Buffe
r
Gro
upin
g
Exec
utio
n
TPL Dataflow
ActionBlock<T>
TransformBlock<T, U>
TransformManyBlock<T, U>
BufferBlock<T>
WriteOnceBlock<T>
BroadcastBlock<T>
BatchBlock<T>
JoinBlock<T, U, …>
BatchedJoinBlock<T, U, …>
TPL Dataflow
BatchBlock<T>
BufferBlock<T>
TransformManyBlock<T, U>
JoinBlock<T, U, …>
ActionBlock<T>
Safe Logger
2015-07-29 18:00:12.565 SimpleLog.iOS [57400:1766661] [2015-07-29T08:00:12.5657180Z] [DBUG00001] [SimpleLog.StartPage.OnSizeAllocated L24]: Size: [568, 288]
Safe Logger
• Test harness for different logging strategies
• Use Scale to increase time spent working vs logging
Safe Logging• There is no completely safe logging
• There's only less dangerous logging
• Measuring something changes the way it behaves
Safe Logging• There is no completely safe logging
• There's only less dangerous logging
• Measuring something changes the way it behaves
• Change as little as possible
Safe Logging• There is no completely safe logging
• There's only less dangerous logging
• Measuring something changes the way it behaves
• Change as little as possible
• Especially threads