প্রথম নজরে, আমি ভেবেছিলাম যে সংকলকটি অপটিমাইজেশন পতাকাগুলি সক্রিয় করে উভয় সংস্করণের জন্য সমমানের সমাবেশ তৈরি করতে পারে। যখন আমি এটি যাচাই করেছি, ফলাফলটি দেখে আমি অবাক হয়েছি:
উৎস unoptimized.cpp
দ্রষ্টব্য: এই কোডটি কার্যকর করা নয়।
struct bitmap_t
{
long long width;
} bitmap;
int main(int argc, char** argv)
{
for (unsigned x = 0 ; x < static_cast<unsigned>(bitmap.width) ; ++x)
{
argv[x][0] = '\0';
}
return 0;
}
উৎস optimized.cpp
দ্রষ্টব্য: এই কোডটি কার্যকর করা নয়।
struct bitmap_t
{
long long width;
} bitmap;
int main(int argc, char** argv)
{
const unsigned width = static_cast<unsigned>(bitmap.width);
for (unsigned x = 0 ; x < width ; ++x)
{
argv[x][0] = '\0';
}
return 0;
}
সংকলন
$ g++ -s -O3 unoptimized.cpp
$ g++ -s -O3 optimized.cpp
সমাবেশ (নিরবচ্ছিন্ন.স)
.file "unoptimized.cpp"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
.cfi_personality 0x3,__gxx_personality_v0
movl bitmap(%rip), %eax
testl %eax, %eax
je .L2
xorl %eax, %eax
.p2align 4,,10
.p2align 3
.L3:
mov %eax, %edx
addl $1, %eax
movq (%rsi,%rdx,8), %rdx
movb $0, (%rdx)
cmpl bitmap(%rip), %eax
jb .L3
.L2:
xorl %eax, %eax
ret
.cfi_endproc
.LFE0:
.size main, .-main
.globl bitmap
.bss
.align 8
.type bitmap, @object
.size bitmap, 8
bitmap:
.zero 8
.ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-16)"
.section .note.GNU-stack,"",@progbits
সমাবেশ (অনুকূলিত)
.file "optimized.cpp"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
.cfi_personality 0x3,__gxx_personality_v0
movl bitmap(%rip), %eax
testl %eax, %eax
je .L2
subl $1, %eax
leaq 8(,%rax,8), %rcx
xorl %eax, %eax
.p2align 4,,10
.p2align 3
.L3:
movq (%rsi,%rax), %rdx
addq $8, %rax
cmpq %rcx, %rax
movb $0, (%rdx)
jne .L3
.L2:
xorl %eax, %eax
ret
.cfi_endproc
.LFE0:
.size main, .-main
.globl bitmap
.bss
.align 8
.type bitmap, @object
.size bitmap, 8
bitmap:
.zero 8
.ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-16)"
.section .note.GNU-stack,"",@progbits
পরিবর্তন
$ diff -uN unoptimized.s optimized.s
--- unoptimized.s 2015-11-24 16:11:55.837922223 +0000
+++ optimized.s 2015-11-24 16:12:02.628922941 +0000
@@ -1,4 +1,4 @@
- .file "unoptimized.cpp"
+ .file "optimized.cpp"
.text
.p2align 4,,15
.globl main
@@ -10,16 +10,17 @@
movl bitmap(%rip), %eax
testl %eax, %eax
je .L2
+ subl $1, %eax
+ leaq 8(,%rax,8), %rcx
xorl %eax, %eax
.p2align 4,,10
.p2align 3
.L3:
- mov %eax, %edx
- addl $1, %eax
- movq (%rsi,%rdx,8), %rdx
+ movq (%rsi,%rax), %rdx
+ addq $8, %rax
+ cmpq %rcx, %rax
movb $0, (%rdx)
- cmpl bitmap(%rip), %eax
- jb .L3
+ jne .L3
.L2:
xorl %eax, %eax
ret
অপ্টিমাইজড সংস্করণটির জন্য উত্পন্ন সমাবেশটি আসলে ( lea
) width
অব্যবহৃত সংস্করণটির বিপরীতে ধ্রুবক লোড করে যা width
প্রতিটি পুনরাবৃত্তিতে অফসেটটি গণনা করে (movq
) এর ।
যখন আমি সময় পাব, শেষ পর্যন্ত আমি এটিতে কিছু মানদণ্ড পোস্ট করব। ভাল প্রশ্ন.
*p
একই ধরণের হয়width
তবে এটি অপ্টিমাইজ করা তুচ্ছ নয়, যেহেতু এটি লুপের অভ্যন্তরেp
নির্দেশ করতেwidth
এবং এটি সংশোধন করতে পারে।