Tali & Plus
Привет, Тали, готова к соревнованию по скоростному кодированию? Представь, нужно оптимизировать игровой цикл так, чтобы он работал плавнее, чем рывок на финише — давай посмотрим, кто быстрее сможет сэкономить миллисекунды!
Конечно! Погнали на трек и выкладывай свои миксы, разгоняй луп как спринт, посмотрим, кто быстрее всех сделает. Готов к гонке?
Давай притормозим с болтовней и дави на газ! Я уже на пике, просто скажи, куда едем, и мы эту трассу выжмем как профи. Готова включать и смотреть, как секунды пролетают?
Кинь сюда код цикла, и начинаем! Пора выжимать последние миллисекунды и выиграть эту гонку!
Вот тебе быстрый и эффективный цикл на C++, который легко оптимизировать с флагом -O3. Просто скопируй, вставь и смотри, как падают миллисекунды:
#include <chrono>
#include <iostream>
int main() {
const int N = 100000000;
volatile long long sum = 0;
auto start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < N; ++i) sum += i; // core work
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> diff = end - start;
std::cout << "Time: " << diff.count() << " s\n";
}
Скомпилируй командой `g++ -O3 -march=native loop.cpp -o loop` и запусти. Если хочешь немного подкрутить, разверни цикл или используй SIMD-инструкции, но это даст тебе хорошую отправную точку. Посмотрим, как заставим эти миллисекунды просто исчезнуть!
Отличный выстрел! Давай запускать — разверни этот цикл, добавь SIMD-трюк и посмотрим, как миллисекунды улетучатся. Готов посмотреть, кто быстрее закончит?
Конечно, давай запустим! Вот быстро написанная версия на C++ (AVX2), готовая к работе:
```cpp
#include <immintrin.h>
#include <chrono>
#include <iostream>
int main() {
const int N = 100000000;
const int stride = 8; // 8 ints per AVX2 vector
__m256i vecSum = _mm256_setzero_si256();
auto start = std::chrono::high_resolution_clock::now();
for (int i = 0; i < N; i += stride) {
__m256i vec = _mm256_set_epi32(i+7,i+6,i+5,i+4,i+3,i+2,i+1,i);
vecSum = _mm256_add_epi32(vecSum, vec);
}
// horizontal add
int tmp[8];
_mm256_storeu_si256((__m256i*)tmp, vecSum);
long long sum = 0;
for (int j = 0; j < 8; ++j) sum += tmp[j];
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> diff = end - start;
std::cout << "Time: " << diff.count() << " s\n";
}
```
Скомпилируй так: `g++ -O3 -march=native -mavx2 simd_loop.cpp -o simd_loop`. Запускай и посмотрим, как секунды сбегут — кто быстрее придет к финишу, тот и похвастается!
Давай запустим и посмотрим, как эти мс упадут! Запускай, засекай время, кто меньше – тот и хвастается. Посмотрим, кто кого!