лучше исключать ветку else тоже -
n = falseVal
if expr {
n = trueVal
}
Я зануда. Я не смогла (себе) доказать, что конструкция if-else медленнее, чем вынос else-опции вперёд if.
1) Первый вариант (с классической конструкцией if-else) выполняется 1953954000 нс ~= 2 c
2) Второй вариант (с заменой else на присвоение перед if, в условии if - верный вариант) выполняется 3907236500 нс ~= 4 c
3) Третий вариант (с заменой else на присвоение перед if, в условии if - ложный вариант) выполняется 3945387700 нс ~= 4 c
Но есть нюанс: наверное, я не корректно измеряю время (хотя вроде теми методами, даже двумя: Since() и Sub(), которыми положено)
Сначала у меня все три способа были в одном файле, и иногда получался такой же результат, как написала, а иногда на всё уходило одинаковое время, 2с.
Потом разделила на разные проекты, и по нескольку раз позапускала, результат выше.
Как вообще корректно, кстати, время измерять?
Первый (уходит 2 с):
package main
import (
"fmt"
"time"
)
func main() {
var i int64
var N int64 = 1e9
a := 1
b := 2
var k int
// 1 - zasekaem vremya na variant s else:
k = 0
start1 := time.Now()
for i = 0; i < N; i++ {
if a < b {
k += 1
} else {
k -= 1
}
}
duration1 := time.Since(start1)
end1 := time.Now()
elapsed1 := end1.Sub(start1)
fmt.Println(duration1.Nanoseconds(), elapsed1.Nanoseconds(), k)
}
Второй (уходит 4 с):
package main
import (
"fmt"
"time"
)
func main() {
var i int64
var N int64 = 1e9
a := 1
b := 2
var k int
// 2 - teper - bez else - vynosim lozhnyj variant vpered, a v if proveriaem tolko pravilnyj variant:
k = 0
start2 := time.Now()
for i = 0; i < N; i++ {
k -= 1
if a < b {
k += 1
}
}
duration2 := time.Since(start2)
end2 := time.Now()
elapsed2 := end2.Sub(start2)
fmt.Println(duration2.Nanoseconds(), elapsed2.Nanoseconds(), k)
}
Третий (уходит 4 с):
package main
import (
"fmt"
"time"
)
func main() {
var i int64
var N int64 = 1e9
a := 1
b := 2
var k int
// 3 - teper - bez else - vynosim true variant vpered, a v if proveriaem tolko nepravilnyj variant:
k = 0
start3 := time.Now()
for i = 0; i < N; i++ {
k += 1
if a > b {
k -= 1
}
}
duration3 := time.Since(start3)
end3 := time.Now()
elapsed3 := end3.Sub(start3)
fmt.Println(duration3.Nanoseconds(), elapsed3.Nanoseconds(), k)
}