Блог пользователя removed1

Автор removed1, 14 лет назад, По-русски

По следам обсуждения

http://codeforces.com/comments/264#comment-3078

На c# умножаем две квадратных матрицы. В одном случае - каждая матрица хранится в массиве массивов, в другом - в двухмерном массиве.

[дисклеймер: эти измерения подобны измерению числа оборотов двигателя на холостом ходу, а не средней скорости автомобиля в условиях гонки, и т.п., проводились один раз и т.п.]

Я взял код maslowmw, изменил size на 500, убрал распечатку времени (что дает несущественную разницу) и понес гонять его в Topcoder Practice Room. К моему удивлению, действительно в той версии дотнета, что установлена на топкодере, двухмерный массив оказался медленнее массива массивов. Меня это заинтересовало и я решил провести измерения других вариантов. Вот они, а выводы делайте сами.

c#:
[i][j]: 1.328s 

[i][j]: 1.156s % size = const int
[i,j]: 1.516s
[i*size+j]: 0.875s

[i*size+j]:  0.703s % size = const int

c++:
int [][]: 0.266s % const int, global
int **: 0.791s
[i*size+j]: 0.286s % where size = const int
[i*size+j]: 0.695s % where size = input parameter
vector<vector<int>> : 0.478s % where size = const int
vector<vector<int>> : 0.608s % where size = input parameter

java:
[i][j]: 1.927s
[i*size+j]: 1.306s

p.s. мэнтайнерам сайта: создайте FAQ по оформлению. и еще, при переходе из почты по ссылке на русский коммент, а активен английский, то коммент разумеется не видно, что запутывает.


  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Спасибо за ссылку, интересно.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Можно увеличить скорость, сделав цикл по j самым внутренним. В этом случае время для c++ int [][] будет 0.205. Впрочем, пропорции наверное останутся прежними.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Еще немного поизвращался с указателями, и время стало 0.154 :)
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Хотелось бы увидеть такие замеры на Python'е. Возможно ли?
      Интересно просто насколько он быстро работает :)
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Я тут о тестировании ArrayList в этом контексте боюсь думать даже, не то что Питон :))
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Еще можно одну из матриц предварительно транспонировать
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Вряд ли это поможет..
        Кстати что значит c++ int **? Динамический массив динамических массивов?
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Да. А есть варианты?
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Если до этого никто с указателями не извращался, то предварительное транспонирование правой матрицы очень даже помогает. См архив в моем следующем посте.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
странный ваш тест..и притом совсем неправдоподобный...попробуйте замерять настоящее время, т.е. там где происходит всё это суммирование. У меня на компе при таком тестировании Java проигрывает не более чем на 25 %.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    О том, что такая проверка нестрогая, я предупредил с самого начала.

    И умышленно тестировал именно на топкодере, чтобы никаких "А У МЕНЯ, А У МЕНЯ" не возникало.

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А теперь переключи компилятор С++ на релиз.. :)