Хм, в примере Мандельброта матрица M имеет свои размеры, транспонированные
M = matrix(0.0,nrow=length(im), ncol=length(re))
, потому что она заполнена путем увеличения count
во внутреннем цикле (последовательные значения im
).Моя реализация создает вектор комплексных чисел в mandelperf.1
и работает со всеми элементами, используя индекс и поднабор для отслеживания того, какие элементы вектора еще не удовлетворяют условию Mod(z) <= 2
mandel.1 = function(z, maxiter=80L) {
c <- z
result <- integer(length(z))
i <- seq_along(z)
n <- 0L
while (n < maxiter && length(z)) {
j <- Mod(z) <= 2
if (!all(j)) {
result[i[!j]] <- n
i <- i[j]
z <- z[j]
c <- c[j]
}
z <- z^2 + c
n <- n + 1L
}
result[i] <- maxiter
result
}
mandelperf.1 = function() {
re = seq(-2,0.5,.1)
im = seq(-1,1,.1)
mandel.1(complex(real=rep(re, each=length(im)),
imaginary=im))
}
для 13-кратного ускорения (результаты равны, но не идентичны, поскольку оригинал возвращает числовые, а не целые значения).
> library(rbenchmark)
> benchmark(mandelperf(), mandelperf.1(),
+ columns=c("test", "elapsed", "relative"),
+ order="relative")
test elapsed relative
2 mandelperf.1() 0.412 1.00000
1 mandelperf() 5.705 13.84709
> all.equal(sum(mandelperf()), sum(mandelperf.1()))
[1] TRUE
Пример быстрой сортировки фактически не сортирует
> set.seed(123L); qsort(sample(5))
[1] 2 4 1 3 5
но моим основным ускорением было векторизация раздела вокруг центра
qsort_kernel.1 = function(a) {
if (length(a) < 2L)
return(a)
pivot <- a[floor(length(a) / 2)]
c(qsort_kernel.1(a[a < pivot]), a[a == pivot], qsort_kernel.1(a[a > pivot]))
}
qsort.1 = function(a) {
qsort_kernel.1(a)
}
sortperf.1 = function(n) {
v = runif(n)
return(qsort.1(v))
}
для 7-кратного ускорения (по сравнению с неоткорректированным оригиналом)
> benchmark(sortperf(5000), sortperf.1(5000),
+ columns=c("test", "elapsed", "relative"),
+ order="relative")
test elapsed relative
2 sortperf.1(5000) 6.60 1.000000
1 sortperf(5000) 47.73 7.231818
Св исходном сравнении Джулия примерно в 30 раз быстрее, чем R для Манделя, и в 500 раз быстрее для быстрой сортировки, приведенные выше реализации все еще не очень конкурентоспособны.