LINUX.ORG.RU

Поменять два числа в памяти

 ,


4

3

Доброе время суток. Собственно интересует какие существуют алгоритмы для того чтобы поменять два числа в памяти машины какой предпочтительнее в плане быстродействия/ресурсозатратности ? На ум приходит только что то типа:

    int TEMP;
    TEMP = Number1;
    Number1 = Number2;
    Number2 = TEMP;



Последнее исправление: Maul (всего исправлений: 2)
Ответ на: комментарий от Maul

я не думаю, что такой маленький участок кода, раскрывающийся в считанные инструкции адекватно рассматривать алгоритмически

anonymous
()
Ответ на: комментарий от sevenredlines

что самое удивительное, это «вроде» работает быстрее, если я правильно понял.

нет, у меня на маке (там вроде интел), сишке и шланге, математика всегда чуть медленнее переменной, но не так сильно как xor

unt1tled ★★★★
()
Ответ на: комментарий от intelfx

Погрешности измерения. Разворачиваются они всё таки в одно и тоже:

"".SwapXOR t=1 size=48 value=0 args=0x10 locals=0x0
        0x0000 00000 (swap.go:3)        TEXT    "".SwapXOR+0(SB),4,$0-16
        0x0000 00000 (swap.go:3)        NOP     ,
        0x0000 00000 (swap.go:3)        NOP     ,
        0x0000 00000 (swap.go:3)        MOVQ    "".b+16(FP),CX
        0x0005 00005 (swap.go:3)        MOVQ    "".a+8(FP),AX
        0x000a 00010 (swap.go:3)        FUNCDATA        $0,gclocals·e8c55b930b09fa5028b5e4b78b8932dc+0(SB)
        0x000a 00010 (swap.go:3)        FUNCDATA        $1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB)
        0x000a 00010 (swap.go:4)        NOP     ,
        0x000a 00010 (swap.go:4)        MOVQ    (AX),DX
        0x000d 00013 (swap.go:4)        NOP     ,
        0x000d 00013 (swap.go:4)        NOP     ,
        0x000d 00013 (swap.go:4)        MOVQ    (CX),BP
        0x0010 00016 (swap.go:4)        XORQ    DX,BP
        0x0013 00019 (swap.go:4)        MOVQ    BP,(AX)
        0x0016 00022 (swap.go:4)        NOP     ,
        0x0016 00022 (swap.go:5)        NOP     ,
        0x0016 00022 (swap.go:5)        MOVQ    (CX),DX
        0x0019 00025 (swap.go:5)        NOP     ,
        0x0019 00025 (swap.go:5)        NOP     ,
        0x0019 00025 (swap.go:5)        MOVQ    (AX),BP
        0x001c 00028 (swap.go:5)        XORQ    DX,BP
        0x001f 00031 (swap.go:5)        MOVQ    BP,(CX)
        0x0022 00034 (swap.go:5)        NOP     ,
        0x0022 00034 (swap.go:6)        NOP     ,
        0x0022 00034 (swap.go:6)        MOVQ    (AX),DX
        0x0025 00037 (swap.go:6)        NOP     ,
        0x0025 00037 (swap.go:6)        NOP     ,
        0x0025 00037 (swap.go:6)        MOVQ    (CX),BP
        0x0028 00040 (swap.go:6)        XORQ    DX,BP
        0x002b 00043 (swap.go:6)        MOVQ    BP,(AX)
        0x002e 00046 (swap.go:6)        NOP     ,
        0x002e 00046 (swap.go:7)        RET     ,

"".SwapTmp t=1 size=32 value=0 args=0x10 locals=0x0
        0x0000 00000 (swap.go:9)        TEXT    "".SwapTmp+0(SB),4,$0-16
        0x0000 00000 (swap.go:9)        NOP     ,
        0x0000 00000 (swap.go:9)        NOP     ,
        0x0000 00000 (swap.go:9)        MOVQ    "".a+8(FP),DX
        0x0005 00005 (swap.go:9)        MOVQ    "".b+16(FP),CX
        0x000a 00010 (swap.go:9)        FUNCDATA        $0,gclocals·e8c55b930b09fa5028b5e4b78b8932dc+0(SB)
        0x000a 00010 (swap.go:9)        FUNCDATA        $1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB)
        0x000a 00010 (swap.go:10)       NOP     ,
        0x000a 00010 (swap.go:10)       MOVQ    (DX),AX
        0x000d 00013 (swap.go:11)       NOP     ,
        0x000d 00013 (swap.go:11)       NOP     ,
        0x000d 00013 (swap.go:11)       MOVQ    (CX),R8
        0x0010 00016 (swap.go:11)       MOVQ    R8,(DX)
        0x0013 00019 (swap.go:12)       NOP     ,
        0x0013 00019 (swap.go:12)       MOVQ    AX,(CX)
        0x0016 00022 (swap.go:13)       RET     ,

"".SwapNative t=1 size=32 value=0 args=0x10 locals=0x0
        0x0000 00000 (swap.go:15)       TEXT    "".SwapNative+0(SB),4,$0-16
        0x0000 00000 (swap.go:15)       NOP     ,
        0x0000 00000 (swap.go:15)       NOP     ,
        0x0000 00000 (swap.go:15)       MOVQ    "".a+8(FP),DX
        0x0005 00005 (swap.go:15)       MOVQ    "".b+16(FP),CX
        0x000a 00010 (swap.go:15)       FUNCDATA        $0,gclocals·e8c55b930b09fa5028b5e4b78b8932dc+0(SB)
        0x000a 00010 (swap.go:15)       FUNCDATA        $1,gclocals·3280bececceccd33cb74587feedb1f9f+0(SB)
        0x000a 00010 (swap.go:16)       NOP     ,
        0x000a 00010 (swap.go:16)       MOVQ    (DX),AX
        0x000d 00013 (swap.go:16)       NOP     ,
        0x000d 00013 (swap.go:16)       NOP     ,
        0x000d 00013 (swap.go:16)       MOVQ    (CX),R8
        0x0010 00016 (swap.go:16)       MOVQ    R8,(DX)
        0x0013 00019 (swap.go:16)       NOP     ,
        0x0013 00019 (swap.go:16)       MOVQ    AX,(CX)
        0x0016 00022 (swap.go:17)       RET     ,

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от mix_mix

Если ничего не путаю, это портабельный asm, один для всех архитектур, который потом переводится в машино-зависимый asm. Но не byte-code, а больше macro-asm.

beastie ★★★★★
()
Ответ на: комментарий от beastie

Интересно, а как они, к примеру, плавающую точку считают?

mix_mix ★★★★★
()
Ответ на: комментарий от intelfx

Тут выпили, но ради тебя так уж и быть - расскажу. С памятью работает только подсистема кешей, которая работает автоматом, не зависимо от исполнителей. Исполнители дёргают кеш, а уж кеш дёргает триггеры загрузки/выгрузки чего-то из/в память и не обязательно это триггерит кеш(т.е. события аля кешмисс, либо когерентность) - есть всякие автопрефетчи. Ну и само-собою кешей много.

Всё остальное — абстракции.

То, что ты описал - это и есть примитивные абстракции из желтушной макулатуры конца 90-х. Так убого даже рассыпуха не работает.

но если у тебя нормальный промышленный компилятор
он твою временную переменную соптимизирует наиболее адекватным для конкретного набора команд способом

Взаимоисключающие параграфы. Т.е. «промышленный компилятор» == говно, но говно не может ничего оптимизировать.

anonymous
()
Ответ на: комментарий от anonymous

Царь оказывается какой-то рецидивист с синдромом дауна. Нифига он не школьник.

anonymous
()
Ответ на: комментарий от anonymous

То, что ты описал - это и есть примитивные абстракции из желтушной макулатуры конца 90-х. Так убого даже рассыпуха не работает.

Как быть со всякими 8-битными контроллерами вроде AVR? У них кэша вообще нету, но они определённо рассыпуха

Harald ★★★★★
()
Ответ на: комментарий от beastie

TL;DR: TL;DR: TL;DR: TL;DR: TL;DR: TL;DR: TL;DR: TL;DR:

только я их вижу,что на лоре что в интернете на форумах

откуда эти тлдр,зачем их пишут,раздражают нереально

anonymous
()
Ответ на: комментарий от anonymous

Ну и зачем ты распинаешься про кэш? Пофиг на то, каким образом происходит трансфер чисел из памяти в регистры. Важно то, что названные вещи реально существуют и участвуют в процессе. А переменные существуют только в памяти компилятора. Именно это я хотел донести до ТСа, чтобы он не мешал котлеты с мухами и правильно формулировал вопрос во избежание срачей.

intelfx ★★★★★
()
Ответ на: комментарий от anonymous

да нагуглил,ожидаемо(я думал это баг/фича с макбука/яфона)...но да хуже чем я думал

банилбы по ип таких

anonymous
()
Ответ на: комментарий от Kuzy

Во-первых, нет (в двоичной вычислительной технике числа — это всего лишь интерпретация человеком или ALU битовых последовательностей).

Во-вторых, и каким боком это сюда относится? Я говорил про «слова», специально для зануд типа тебя.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Ну и зачем ты распинаешься про кэш? Пофиг на то, каким образом происходит трансфер чисел из памяти в регистры.

А если пофиг, то зачем ты начал задвигать про какую-то шину?

Зачем ты меня пытаешься обмануть?

Важно то, что названные вещи реально существуют и участвуют в процессе.

Собственно как и то, что ты назвал «только абстракции». Разговор был не об участии, а об «как работает, аля не абстракции» - не форатнуло. Дак вот - работает без их прямого участия, а они есть часть системы поддержания инварианта среды.

И то описание вообще никакого отношения даже к «среде» не имеет, но тут вроде ты съехал только на название.

А переменные существуют только в памяти компилятора. Именно это я хотел донести до ТСа, чтобы он не мешал котлеты с мухами и правильно формулировал вопрос во избежание срачей.

К чему ты тогда это написал? Я написал это к тому, что бы ты не путал людей своим не связанным с реальностью пояснением. Ты же написал только лишь для того, что бы сострить, аля «смотри как она на самом деле».

Только так и не иначе. Твоё описание хоть чутка должно описывать реальное поведение, а не хрен пойми что. Реальное описание структур я с тебя не требую, ибо его не знаю ни я, ни ты. Не можешь описать - не пиши ничего. Тем более тут это описание чисто для понта.

anonymous
()
Ответ на: комментарий от mix_mix

icc не промышленный конпелятор, а просто универсальный выхлоп вендора каменьев.

Хотя по оптимизациям - да, icc лидер по реплейсу убогой лапши и иных говн сишноклассных днищеваятелей. Собственно он под это и затачивался. В остальном то ещё днище, даже шедулить инструкции под штеуд умеет хуже гцц. Я до сих пор не понимаю какой жопой так вышло.

anonymous
()
Ответ на: комментарий от anonymous

Что-то я сразу и не приметил, с кем имею дело. iptables -A INPUT -s царь -j DROP

И нет, я рассказывал не про «как оно работает на самом деле», а про физику vs. абстракции ЯП, потому что у ТС в вопросе каша.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от anonymous

задвигать про какую-то шину
не форатнуло
когда с зоны откинусь
чисто для понта

Теперь понятно откуда у него уголовный сленг.

anonymous
()
Ответ на: комментарий от anonymous

Не в колонию, а в лагеря. Детский, оздоровительный. С мягкими стенами такими, как я люблю.

За слишком скилловое поведение. Обоссывал лалок пачками, ссал на головы, вернее как - опосредованно, вынуждал ссать самим себе, 5-ти звездачным питушкам на лоре. Нихрена не делал. Собственно как всегда - царь вроде как питух, но не уязвим для лалок. Жопы рвутся. За то и повязали.

anonymous
()
Ответ на: комментарий от intelfx

Да игнорь, игнорь. О5 глупые понты. Как можно не приметить - на лоре из тех, кто пишет - штуки полтора человека, который хоть что-то понимает на уровне чуть выше говномакулатуры протухшей с мифами прошлого века.

И нет, я рассказывал не про «как оно работает на самом деле», а про физику vs. абстракции ЯП, потому что у ТС в вопросе каша.

Да, да. Именно про физику. С ней и не проканало.

потому что у ТС в вопросе каша

Собственно, как и тебя с, минимум, физикой. Так мило, когда один кашист рассказывает другому кашисту, - как там без каши.

anonymous
()
Ответ на: комментарий от anonymous

2015−1997 - надеюсь сможешь.

Прямо с рождения читал? Так и скажи, что в колонии других книжек нет. Ты же не виноват, что они нормальные не завозят.

Как все-таки в тюрьме человек быстро взрослеет. А ведь еще совсем недавно бегал тут среди взрослых и пищал: «вы все питухи! питухи! пиу-пиу!». Прямо слезы наворачиваются, как вспомню.

anonymous
()
Ответ на: комментарий от anonymous

Не в колонию, а в лагеря. Детский, оздоровительный.

Ну, кому тюрьма, а кому и мать родна.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.