@@ -335,6 +335,63 @@ func TestAcyclicGraphWalk_error(t *testing.T) {
335335
336336}
337337
338+ func BenchmarkDAG (b * testing.B ) {
339+ for i := 0 ; i < b .N ; i ++ {
340+ count := 150
341+ b .StopTimer ()
342+ g := & AcyclicGraph {}
343+
344+ // create 4 layers of fully connected nodes
345+ // layer A
346+ for i := 0 ; i < count ; i ++ {
347+ g .Add (fmt .Sprintf ("A%d" , i ))
348+ }
349+
350+ // layer B
351+ for i := 0 ; i < count ; i ++ {
352+ B := fmt .Sprintf ("B%d" , i )
353+ g .Add (fmt .Sprintf (B ))
354+ for j := 0 ; j < count ; j ++ {
355+ g .Connect (BasicEdge (B , fmt .Sprintf ("A%d" , j )))
356+ }
357+ }
358+
359+ // layer C
360+ for i := 0 ; i < count ; i ++ {
361+ c := fmt .Sprintf ("C%d" , i )
362+ g .Add (fmt .Sprintf (c ))
363+ for j := 0 ; j < count ; j ++ {
364+ // connect them to previous layers so we have something that requires reduction
365+ g .Connect (BasicEdge (c , fmt .Sprintf ("A%d" , j )))
366+ g .Connect (BasicEdge (c , fmt .Sprintf ("B%d" , j )))
367+ }
368+ }
369+
370+ // layer D
371+ for i := 0 ; i < count ; i ++ {
372+ d := fmt .Sprintf ("D%d" , i )
373+ g .Add (fmt .Sprintf (d ))
374+ for j := 0 ; j < count ; j ++ {
375+ g .Connect (BasicEdge (d , fmt .Sprintf ("A%d" , j )))
376+ g .Connect (BasicEdge (d , fmt .Sprintf ("B%d" , j )))
377+ g .Connect (BasicEdge (d , fmt .Sprintf ("C%d" , j )))
378+ }
379+ }
380+
381+ b .StartTimer ()
382+ // Find dependencies for every node
383+ for _ , v := range g .Vertices () {
384+ _ , err := g .Ancestors (v )
385+ if err != nil {
386+ b .Fatal (err )
387+ }
388+ }
389+
390+ // reduce the final graph
391+ g .TransitiveReduction ()
392+ }
393+ }
394+
338395func TestAcyclicGraph_ReverseDepthFirstWalk_WithRemoval (t * testing.T ) {
339396 var g AcyclicGraph
340397 g .Add (1 )
0 commit comments