addint an if clause to print out progress

reps <- 20L

# MOD
    YesPrint <- quote(for (i in 1:10e3) { 
              (i + i)
              if (i %% 100 == 0)
                print(paste("i is at ", i))
            })


    NoPrint <- quote(for (i in 1:10e3) { 
          (i + i)
        })


    library(microbenchmark)
    microbenchmark(YES=eval(YesPrint), NO=eval(NoPrint), times=reps)



#----------------------------------------------------------------------------------$
# TESTING DIFFERENT TYPES OF `if(.)` CLAUSES
#----------------------------------------------------------------------------------$
    progs <- seq(0, 10e3, 100)

    JustIf.Any <- quote(for (i in 1:10e3) { 
          (i + i)
          if (any(i == progs))
            {}
        })


    JustIf.In <- quote(for (i in 1:10e3) { 
          (i + i)
          if (i %in% progs)
            {}
        })


    JustIf.Mod <- quote(for (i in 1:10e3) { 
          (i + i)
          if (i %% 100 == 0)   # <~~~~~~ CLEAR WINNER
            {}
        })

    microbenchmark(JustIf.Any=eval(JustIf.Any), JustIf.Mod=eval(JustIf.Mod), JustIf.In=eval(JustIf.In), NO=eval(NoPrint), times=reps)

    # Unit: milliseconds
    #         expr       min       lq    median        uq       max
    # 1 JustIf.Any 33.498797 33.88118 34.254041 52.723921  54.88743
    # 2  JustIf.In 93.264389 96.07759 97.141849 98.231682 112.42858
    # 3 JustIf.Mod 16.199802 16.64062 16.789639 34.816539  40.00592
    # 4         NO  7.377428  7.46080  7.612843  7.744315  28.72765


#----------------------------------------------------------------------------------$
# TESTING DIFFERENT SIZE OF PROGRESS CHECKS
#----------------------------------------------------------------------------------$
# Results:  No Difference

    JustIf.Mod.1k <- quote(for (i in 1:10e3) { 
          (i + i)
          if (i %% 1000 == 0)   # <~~~~~~ CLEAR WINNER
            {}
        })


    microbenchmark(JustIf.Mod=eval(JustIf.Mod), JustIf.Mod.1k=eval(JustIf.Mod.1k), NO=eval(NoPrint), times=reps)

      # Unit: milliseconds
      #            expr       min        lq    median        uq      max
      # 1    JustIf.Mod 16.020285 16.183704 16.297460 30.592688 30.90160
      # 2 JustIf.Mod.1k 16.115842 16.216557 16.467242 30.422521 41.96144
      # 3            NO  7.494472  7.524736  7.541803  7.577925 21.58220


#----------------------------------------------------------------------------------$
# TESTING EXPLICTLY HAVING THE VALUE BE INTEGER
#----------------------------------------------------------------------------------$
# Results:  Oddly, non-integer is a tiny bit faster

    JustIf.Mod.Int <- quote(for (i in 1:10e3) { 
          (i + i)
          if (i %% 100L == 0)   # <~~~~~~ CLEAR WINNER
            {}
        })


    microbenchmark(JustIf.Mod=eval(JustIf.Mod), JustIf.Mod.Int=eval(JustIf.Mod.Int), NO=eval(NoPrint), times=reps)
    #   Unit: milliseconds
    #               expr       min        lq    median        uq      max
    #   1     JustIf.Mod 16.115013 16.229251 16.322665 30.350729 30.96484
    #   2 JustIf.Mod.Int 17.290402 17.446780 17.959834 31.721308 99.06184
    #   3             NO  7.356836  7.555711  7.584177  7.669984 21.68533



#----------------------------------------------------------------------------------$
# DIFFERENT MESSAGE TYPES 
#----------------------------------------------------------------------------------$
# `cat()` wins over `print()`
#    
    Print <- quote(for (i in 1:10e3) { 
              (i + i)
              if (i %% 100 == 0)
                print(i)
            })

    Print.Paste <- quote(for (i in 1:10e3) { 
              (i + i)
              if (i %% 100 == 0)
                print(paste("i is at ", i))
            })

    Cat <- quote(for (i in 1:10e3) { 
              (i + i)
              if (i %% 100 == 0)
                cat(i)
            })

    Cat.Paste <- quote(for (i in 1:10e3) { 
              (i + i)
              if (i %% 100 == 0)
                cat("i is at ", i, "\n")
            })

    microbenchmark(Print=eval(Print), Print.Paste=eval(Print.Paste),
                  Cat=eval(Cat), Cat.Paste=eval(Cat.Paste), 
                  times=reps)

    #           expr      min       lq   median       uq      max
    #  1         Cat 17.19480 17.34488 18.15880 19.98436 63.90262
    #  2   Cat.Paste 17.79990 17.97067 18.51673 20.54389 65.35676
    #  3       Print 18.36415 19.26677 21.12830 21.48435 70.44506
    #  4 Print.Paste 20.46146 20.59412 21.28874 22.94645 23.77814 

    

