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

Автор wnmrmr, история, 9 месяцев назад, По-английски

Hi, if you compare this submission (296ms) with this one (3025ms), this is the difference:

I think this is crazy because g is a vector<vector<int>> with size 3 * 10^5 with at most 3 * 10^5 entries, and the function build that returns g is called once in the program. This huge time difference is the same on both 64-bit C++ compilers, but it is not present in the 32-bit C++ compiler.

UPD: Calling the function build twice solves the problem

  1. Normal submission (3041ms)
  2. Changed submission (327ms)

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

»
9 месяцев назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Auto comment: topic has been updated by wnmrmr (previous revision, new revision, compare).

»
9 месяцев назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

Looks like the problem is in tuple. Removed it and got 300 ms: link

Would be nice to know, why it happens.

  • »
    »
    9 месяцев назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    The output of build() in the "good" version is immediately cast to the tuple, while the "bad" version performs some expensive type conversions. Just look at the disassembly using GDB.

»
9 месяцев назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Auto comment: topic has been updated by wnmrmr (previous revision, new revision, compare).

»
9 месяцев назад, # |
  Проголосовать: нравится +42 Проголосовать: не нравится

So $$$x = 3000$$$ and $$$2x = 300$$$? Hmm...

»
9 месяцев назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Probably that particular version of compiler doesn't handle captures of structured bindings well.