Guest User

Untitled

a guest
Jun 23rd, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.11 KB | None | 0 0
  1. // Scala code to compare performance of nested int loops
  2. object MatMul {
  3. def matMulUsingIterators(
  4. a: Array[Array[Double]],
  5. b: Array[Array[Double]],
  6. c: Array[Array[Double]]): Unit = {
  7.  
  8. val b_j = new Array[Double](b.length)
  9.  
  10. for (j <- 0 until b(0).length) {
  11. for (k <- 0 until b.length) {
  12. b_j(k) = b(k)(j)
  13. }
  14. for (i <- 0 until a.length) {
  15. val c_i = c(i)
  16. val a_i = a(i)
  17. var s = 0.0d;
  18. for (k <- 0 until b.length) {
  19. s += a_i(k) * b_j(k)
  20. }
  21. c_i(j) = s
  22. }
  23. }
  24. }
  25.  
  26. def matMulUsingRanges(
  27. a: Array[Array[Double]],
  28. b: Array[Array[Double]],
  29. c: Array[Array[Double]]): Unit = {
  30.  
  31. val jRange = 0 until b(0).length // p
  32. val kRange = 0 until b.length // n
  33. val iRange = 0 until a.length // m
  34.  
  35. val b_j = new Array[Double](b.length)
  36.  
  37. for (j <- jRange) {
  38. for (k <- kRange) {
  39. b_j(k) = b(k)(j)
  40. }
  41. for (i <- iRange) {
  42. val c_i = c(i)
  43. val a_i = a(i)
  44. var s = 0.0d;
  45. for (k <- kRange) {
  46. s += a_i(k) * b_j(k)
  47. }
  48. c_i(j) = s
  49. }
  50. }
  51. }
  52.  
  53. def matMulUsingLimits(
  54. a: Array[Array[Double]],
  55. b: Array[Array[Double]],
  56. c: Array[Array[Double]]): Unit = {
  57.  
  58. val b_j = new Array[Double](b.length)
  59.  
  60. val m = a.length
  61. val p = b(0).length
  62. val n = b.length
  63.  
  64. for (j <- 0 until p) {
  65. for (k <- 0 until n) {
  66. b_j(k) = b(k)(j)
  67. }
  68. for (i <- 0 until m) {
  69. val c_i = c(i)
  70. val a_i = a(i)
  71. var s = 0.0d;
  72. for (k <- 0 until n) {
  73. s += a_i(k) * b_j(k)
  74. }
  75. c_i(j) = s
  76. }
  77. }
  78. }
  79.  
  80. def matMulUsingWhileLoop(
  81. a: Array[Array[Double]],
  82. b: Array[Array[Double]],
  83. c: Array[Array[Double]]): Unit = {
  84.  
  85. val m = a.length
  86. val p = b(0).length
  87. val n = b.length
  88.  
  89. val b_j = new Array[Double](b.length)
  90.  
  91. var i = 0;
  92. var j = 0;
  93. var k = 0
  94. while (j < p) {
  95. k = 0
  96. while (k < n) {
  97. b_j(k) = b(k)(j)
  98. k += 1
  99. }
  100. i = 0
  101. while (i < m) {
  102. val c_i = c(i)
  103. val a_i = a(i)
  104. var s = 0.0d;
  105. k = 0
  106. while (k < n) {
  107. s += a_i(k) * b_j(k)
  108. k += 1
  109. }
  110. c_i(j) = s
  111. i += 1
  112. }
  113. j += 1
  114. }
  115. }
  116.  
  117. def time[R](block: => R): (Long, R) = {
  118. val start = System.nanoTime()
  119. val result: R = block
  120. val time = System.nanoTime() - start
  121. (time, result)
  122. }
  123.  
  124. val format = new java.text.DecimalFormat("0,000'ns'");
  125. def report[R](label: String, result: (Long, R)) = {
  126. println(label + " " + format.format(result._1))
  127. }
  128.  
  129. private val FACTOR = 15
  130. private val M = 80
  131. private val N = 70
  132. private val P = 60
  133.  
  134. def main(args: Array[String]) = {
  135. for (trial <- 10 until 0 by -1) {
  136. val factor = (if (System.getProperty("factor") != null)
  137. Integer.parseInt(System.getProperty("factor"))
  138. else
  139. FACTOR)
  140. val multiplier = if (trial == 1) factor else 1;
  141. val m = M * multiplier
  142. val n = N * multiplier
  143. val p = P * multiplier
  144. val a = new Array[Array[Double]](m, n)
  145. val b = new Array[Array[Double]](n, p)
  146. val c = new Array[Array[Double]](m, p)
  147. if (trial == 1) {
  148. println("\nMultiply c[" + m + "," + p + "] = a[" + m + "," + n + "] times b[" + n + "," + p + "]\n");
  149. val whileTime = time(matMulUsingWhileLoop(a, b, c))
  150. val iterTime = time(matMulUsingIterators(a, b, c))
  151. report("Iterators ", iterTime)
  152. report("Limits ", time(matMulUsingLimits(a, b, c)))
  153. report("Ranges ", time(matMulUsingRanges(a, b, c)))
  154. report("While Loop ", whileTime)
  155. println("MatMul by Iterators is %.2f times as slow as with while loops.".format(iterTime._1.toDouble / whileTime._1.toDouble))
  156. }
  157. }
  158. }
  159. }
  160.  
  161. MatMul.main(null)
Add Comment
Please, Sign In to add comment