All streams
Search
Write a publication
Pull to refresh

Comments 7

Простите, а на cpu\gpu тоже так стенку можно приподнять? Есть игра Powder Toys, там не такие разрешения а тормозит даже на топовом железе если прям адово что-то взрывать. Игра как раз на частицах основана. Их там конечно, миллионы, но не такие бешеные как у вас. Или я ошибаюсь?

Не гоутист и сиё:

"Но если переписать вот так:

for i := job.startIndex; i < job.endIndex; i++ {  p := &particles[i]  p.x += p.dx}

Получается заметный прирост. Логично:"

Не выглядит логичным. Как?

Грубо: Вв го обращение к слайсу по индексу - это синтаксический сахар с проверкой границ слайса. В исходном варианте - два обращения и две проверки.

В первом примере мы 2 раза обращаемся по индексу массива, во втором только один раз. Го в данном случае каждый раз совершает bounds-check для того, чтобы какая-то Go-рутина не изменила массив так, что i попадет за пределы массива. Обычно в стандартных библиотеках go это делается чуть иначе: используется паттерн _ = slice[i], но вариант с адресом тоже рабочий. Вообще было бы неплохо до цикла сделать проверку на то, что jobs.startIndex не выходит за пределы массива, если алгоритм позволяет

Только вчера была статья, как в C# можно массивы нарезать на подслайсы и итерироваться уже по ним. Компилятор понимал, что индекс всегда внутри границ, и полностью убирал проверки. Разве в го нет подобного?

например:

var jobParticles = particles[job.startIndex..job.endIndex]
for &p := jobParticles {
  p.x += p.dx
}

Есть, но с чуть большим гемором.

А вообще вывод в статье верный - го как числодробилка не очень чтобы подходит

Sign up to leave a comment.

Articles