All streams
Search
Write a publication
Pull to refresh
20
0
m1kc @m1kc

User

Send message
Просто пользуйтесь тестовыми серверами во время начальной настройки, там лимиты во много раз выше: certbot --test-cert.
Без /m:

С указателями:

Скрытый текст
   0x0000000000400a7a <+426>:	add    $0x4,%rbx
   0x0000000000400a7e <+430>:	cmp    $0x28,%rbx
   0x0000000000400a82 <+434>:	jne    0x400a50 <main()+384>
   0x0000000000400a84 <+436>:	lea    0x10(%r12),%rax
   0x0000000000400a89 <+441>:	lea    0x10(%r13),%rdx
   0x0000000000400a8d <+445>:	cmp    %rax,%r13
   0x0000000000400a90 <+448>:	setae  %cl
   0x0000000000400a93 <+451>:	cmp    %rdx,%r12
   0x0000000000400a96 <+454>:	setae  %dl
   0x0000000000400a99 <+457>:	or     %dl,%cl
   0x0000000000400a9b <+459>:	je     0x400b60 <main()+656>
   0x0000000000400aa1 <+465>:	cmp    %rax,%rbp
   0x0000000000400aa4 <+468>:	lea    0x10(%rbp),%rax
   0x0000000000400aa8 <+472>:	setae  %dl
   0x0000000000400aab <+475>:	cmp    %rax,%r12
   0x0000000000400aae <+478>:	setae  %al
   0x0000000000400ab1 <+481>:	or     %al,%dl
   0x0000000000400ab3 <+483>:	je     0x400b60 <main()+656>
   0x0000000000400ab9 <+489>:	movdqu 0x0(%rbp),%xmm1
   0x0000000000400abe <+494>:	lea    0x20(%r12),%rax
   0x0000000000400ac3 <+499>:	mov    $0x2,%edx
   0x0000000000400ac8 <+504>:	movdqu 0x0(%r13),%xmm0
   0x0000000000400ace <+510>:	paddd  %xmm1,%xmm0
   0x0000000000400ad2 <+514>:	movdqu %xmm0,(%r12)
   0x0000000000400ad8 <+520>:	movdqu 0x10(%rbp),%xmm1
   0x0000000000400add <+525>:	add    $0x20,%rbp
   0x0000000000400ae1 <+529>:	movdqu 0x10(%r13),%xmm0
   0x0000000000400ae7 <+535>:	add    $0x20,%r13
   0x0000000000400aeb <+539>:	paddd  %xmm1,%xmm0
   0x0000000000400aef <+543>:	movdqu %xmm0,0x10(%r12)
   0x0000000000400af6 <+550>:	sub    $0x1,%edx
   0x0000000000400af9 <+553>:	lea    0x4(,%rdx,4),%rsi
   0x0000000000400b01 <+561>:	xor    %edx,%edx
   0x0000000000400b03 <+563>:	nopl   0x0(%rax,%rax,1)
   0x0000000000400b08 <+568>:	mov    0x0(%rbp,%rdx,1),%ecx
   0x0000000000400b0c <+572>:	add    0x0(%r13,%rdx,1),%ecx
   0x0000000000400b11 <+577>:	mov    %ecx,(%rax,%rdx,1)
   0x0000000000400b14 <+580>:	add    $0x4,%rdx



С индексами:

Скрытый текст
   0x0000000000400962 <+146>:	add    $0x4,%rbx
   0x0000000000400966 <+150>:	cmp    $0x28,%rbx
   0x000000000040096a <+154>:	jne    0x400938 <main()+104>
   0x000000000040096c <+156>:	lea    0x10(%rbp),%rax
   0x0000000000400970 <+160>:	lea    0x10(%r12),%rdx
   0x0000000000400975 <+165>:	cmp    %rax,%r12
   0x0000000000400978 <+168>:	setae  %cl
   0x000000000040097b <+171>:	cmp    %rdx,%rbp
   0x000000000040097e <+174>:	setae  %dl
   0x0000000000400981 <+177>:	or     %dl,%cl
   0x0000000000400983 <+179>:	je     0x400b54 <main()+644>
   0x0000000000400989 <+185>:	cmp    %rax,%r13
   0x000000000040098c <+188>:	lea    0x10(%r13),%rax
   0x0000000000400990 <+192>:	setae  %dl
   0x0000000000400993 <+195>:	cmp    %rax,%rbp
   0x0000000000400996 <+198>:	setae  %al
   0x0000000000400999 <+201>:	or     %al,%dl
   0x000000000040099b <+203>:	je     0x400b54 <main()+644>
   0x00000000004009a1 <+209>:	movdqu 0x0(%r13),%xmm1
   0x00000000004009a7 <+215>:	mov    $0x2,%edx
   0x00000000004009ac <+220>:	mov    $0x8,%eax
   0x00000000004009b1 <+225>:	movdqu (%r12),%xmm0
   0x00000000004009b7 <+231>:	paddd  %xmm1,%xmm0
   0x00000000004009bb <+235>:	movdqu %xmm0,0x0(%rbp)
   0x00000000004009c0 <+240>:	movdqu 0x10(%r13),%xmm1
   0x00000000004009c6 <+246>:	movdqu 0x10(%r12),%xmm0
   0x00000000004009cd <+253>:	paddd  %xmm1,%xmm0
   0x00000000004009d1 <+257>:	movdqu %xmm0,0x10(%rbp)
   0x00000000004009d6 <+262>:	shl    $0x2,%rax
   0x00000000004009da <+266>:	sub    $0x1,%edx
   0x00000000004009dd <+269>:	lea    0x4(,%rdx,4),%rsi
   0x00000000004009e5 <+277>:	add    %rax,%r13
   0x00000000004009e8 <+280>:	add    %rax,%r12
   0x00000000004009eb <+283>:	xor    %edx,%edx
   0x00000000004009ed <+285>:	add    %rbp,%rax
   0x00000000004009f0 <+288>:	mov    0x0(%r13,%rdx,1),%ecx
   0x00000000004009f5 <+293>:	add    (%r12,%rdx,1),%ecx
   0x00000000004009f9 <+297>:	mov    %ecx,(%rax,%rdx,1)
   0x00000000004009fc <+300>:	add    $0x4,%rdx

А, ну да. Тогда получается, что последняя команда — jne, и вопpос «где цикл?» отпадает сам собой.
Каким образом запись a[i] может изменить значение N?
В данном примере N = 10. Код полон, это всё, что относится к циклу.
Запустил gdb и дизассемблиpовал с ключом /m.
Ну очевидно же — оптимизироваться будет не так плохо, как глобальная, но хуже, чем локальная. Если она private и к ней обращается только один метод — случай аналогичен локальной (не уверен, что любой компилятор это поймёт, но вышеупомянутый gcc понял).
Ну, начнём с того, что компиляторы GCC и ICC есть под Linux, а MS и Borland — нету. Взглянуть на их результаты мне тоже было бы любопытно.
Тогда одинаково. Но на практике длина массива далеко не всегда является константой, и локальная переменная создаёт больший простор для оптимизации.
Пробуем на gcc 4.7.2 c -O2:

Скрытый текст
   0x00000000004008d6 <+6>:	mov    $0xa,%ebx
   0x00000000004008db <+11>:	sub    $0x8,%rsp
   0x00000000004008df <+15>:	nop
16		{
17			int N = 10;
18			for (int i=0; i<N; i++)
   0x00000000004008e5 <+21>:	sub    $0x1,%ebx
   0x00000000004008e8 <+24>:	jne    0x4008e0 <main()+16>
19			{
20				doSomething();
   0x00000000004008e0 <+16>:	callq  0x400b90 <doSomething()>
21			}



Скрытый текст
24			for (int i=0; i<globalN; i++)
   0x00000000004008ea <+26>:	mov    0x2009d0(%rip),%eax        # 0x6012c0 <globalN>
   0x00000000004008f0 <+32>:	xor    %ebx,%ebx
   0x00000000004008f2 <+34>:	test   %eax,%eax
   0x00000000004008f4 <+36>:	jle    0x400910 <main()+64>
   0x00000000004008f6 <+38>:	nopw   %cs:0x0(%rax,%rax,1)
   0x0000000000400905 <+53>:	add    $0x1,%ebx
   0x0000000000400908 <+56>:	cmp    %ebx,0x2009b2(%rip)        # 0x6012c0 <globalN>
   0x000000000040090e <+62>:	jg     0x400900 <main()+48>
25			{
26				doSomething();
   0x0000000000400900 <+48>:	callq  0x400b90 <doSomething()>

27			}



Чувствуете разницу? В случае с локальной переменной вообще нет обращений к памяти.
В определении действительно была ошибка. Исправил. Почему вы не написали в личку?
Да, вы правы. Я проверил — оба варианта действительно вектоpизуются. Только код получается немного разным:

Скрытый текст
44			for (int i=0; i<N; i++)
   0x0000000000400828 <+536>:	cmp    %rsi,%rdx
   0x000000000040082b <+539>:	jne    0x400818 <main()+520>
   0x000000000040082d <+541>:	lea    0x28(%r12),%rbx
45			{
46				*a++ = *b++ + *c++;
   0x00000000004007c9 <+441>:	movdqu 0x0(%rbp),%xmm1
   0x00000000004007ce <+446>:	lea    0x20(%r12),%rax
   0x00000000004007d3 <+451>:	mov    $0x2,%edx
   0x00000000004007d8 <+456>:	movdqu 0x0(%r13),%xmm0
   0x00000000004007de <+462>:	paddd  %xmm1,%xmm0
   0x00000000004007e2 <+466>:	movdqu %xmm0,(%r12)
   0x00000000004007e8 <+472>:	movdqu 0x10(%rbp),%xmm1
   0x00000000004007ed <+477>:	add    $0x20,%rbp
   0x00000000004007f1 <+481>:	movdqu 0x10(%r13),%xmm0
   0x00000000004007f7 <+487>:	add    $0x20,%r13
   0x00000000004007fb <+491>:	paddd  %xmm1,%xmm0
   0x00000000004007ff <+495>:	movdqu %xmm0,0x10(%r12)
   0x0000000000400818 <+520>:	mov    0x0(%rbp,%rdx,1),%ecx
   0x000000000040081c <+524>:	add    0x0(%r13,%rdx,1),%ecx
   0x0000000000400821 <+529>:	mov    %ecx,(%rax,%rdx,1)
   0x0000000000400824 <+532>:	add    $0x4,%rdx
47			}



Скрытый текст
20			for (int i=0; i<N; i++)
   0x00000000004006bc <+172>:	mov    $0x8,%eax
   0x0000000000400710 <+256>:	cmp    %rsi,%rdx
   0x0000000000400713 <+259>:	jne    0x400700 <main()+240>
21			{
22				a[i] = b[i]+c[i];
   0x00000000004006b1 <+161>:	movdqu 0x0(%r13),%xmm1
   0x00000000004006b7 <+167>:	mov    $0x2,%edx
   0x00000000004006c1 <+177>:	movdqu (%r12),%xmm0
   0x00000000004006c7 <+183>:	paddd  %xmm1,%xmm0
   0x00000000004006cb <+187>:	movdqu %xmm0,0x0(%rbp)
   0x00000000004006d0 <+192>:	movdqu 0x10(%r13),%xmm1
   0x00000000004006d6 <+198>:	movdqu 0x10(%r12),%xmm0
   0x00000000004006dd <+205>:	paddd  %xmm1,%xmm0
   0x00000000004006e1 <+209>:	movdqu %xmm0,0x10(%rbp)
   0x0000000000400700 <+240>:	mov    0x0(%r13,%rdx,1),%ecx
   0x0000000000400705 <+245>:	add    (%r12,%rdx,1),%ecx
   0x0000000000400709 <+249>:	mov    %ecx,(%rax,%rdx,1)
   0x000000000040070c <+252>:	add    $0x4,%rdx
23			}



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

Information

Rating
Does not participate
Location
Пенза, Пензенская обл., Россия
Registered
Activity