الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ايهما اسرع ؟

بدأه soufianosse في 3 يناير 2010 · 14 رد · 1,471 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

نشاهد المتال :

#include <iostream.h>

int main() 
{

 char a[]="soufiane";

  a[2]=a[3];  // 1

  *(a+2) = *(a+3); // 2

  for (int i=0;i<8;i++)
  {
  cout << a;
}

cout << endl;




   system("PAUSE");  
   return 0;
}

هناك الطريقة 1

a[2]=a[3];

والطريقة 2

*(a+2) = *(a+3);

لمادا التانية اسرع من الاولى ؟ ففي الاولى لدينا a عبارة عن مؤشر على عنوان اول خلية في الـArray

وهدا يعني ان نأخد القيمة المخزنة في العنوان الدي يبعد عن a بتلات خانات ونضعه في العنوان الدي يبعد عن a بخانتين

الحالة 2 لدينا Pointer + Integer = Adress وقمنا بعمل مؤشر على هدا العنوان تم عملنا عملية تبادل بين القيمة المخزنة في هدا العنوان والقيمة الاخرى

سؤالي هو اين تتجلى السرعة ؟

فالاولى نتعامل مع عنوانين لان a هو اصلا Pointer والتانية نتعامل ايضا مع Pointer

تم تعديل هذه المشاركة بواسطة soufianosse في 3 يناير 2010 في 21:01

#2

و عليكم السلام...

اقتباس
لمادا التانية اسرع من الاولى ؟

و لماذا تعتقد أن الثانية "ممكن" أن تكون أسرع من الأولى؟

في الحقيقة أن كلاهما بالضبط, متساويان. "بالضبط" :)

الحالة التي يكون فيها الـ pointer arithmetic أسرع, و لاحظ أني أقول الـ arithmetic و ليس استخدامها كما تستخدم المصفوفة, هي على منصات تكون فيها عملية الـ offsetting بطيئة.

و لكن في المنصات الحديثة عمليات الـ offsetting لا يمكن حتى التفكير في أنها تضع overhead إن كان هناك أصلاً.

#3

شكرا لك اخي :happy:

لكن ما المقصود بـoverhead فانا جديد مع المؤشرات مازلنا ندرس فيها مند 3 اسابيع :blush:

#4
soufianosse كتب:

شكرا لك اخي :happy:

لكن ما المقصود بـoverhead فانا جديد مع المؤشرات مازلنا ندرس فيها مند 3 اسابيع :blush:

أخي soufianosse

إن كنت تستخدم compiler يسمح لك بعمل Debug وعرض الشفرة المصدرية بالأسمبلي خلال هذا، باعتبار أنك من المهتمين بالأسمبلي، انظر الفرق بالأسمبلي بين الشفرتين..

تستطيع أكثر معرفة ما يحصل.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5

اممم هدا ما كنت ابحت عنه من زمان :ohmy:

اكتب برنامج بلغة سي و في نفس الوقت اطلع على الشفرة بالاسمبلي لكن لا اعرف الطريقة

انا استعمل dev c ++ // code block كيف اعمل هدا على احد هده المترجمات ؟

#6

اين انت يا X :wacko:

قلتها وهربت :lol:

#7

MSVS فيه هذا الأمر.

لم أستخدم أي كومبايلر آخر سواه.

احصل على النسخة المجانية Express من موقع ميكو.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#8

لقد نصبت النسخة الاخيرة المجانية سابقا لكن واجهتني مشاكل تقل الجهاز :mellow:

هل النسخة 6.0 جيدة ؟

#9
soufianosse كتب:

هل النسخة 6.0 جيدة ؟

لا أعلم إن كانت تحوي ذات ما أتكلم عنه (أعجبتني في نسخة 2008 فهي توضح كل سطر بالـ ++C الكتلة المقابلة له بالأسمبلي)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#10

السلام عليكم،

لكي تظهر الشفرة بالأسيمبلي في CodeBlocks، استخدم Debug وضع Breakpoint في المكان الذي ترغب فيه، عندما يصل الـ Debugger للـ Breakpoint، إذهب إلى القائمة Debug ثم Debugging windows ثم Disassembly، سيعرض لك كود الإجراء الذي أنت فيه الآن. :)

في نفس المكان هنالك أيضاً CPU Registers و Call Stack.

تم تعديل هذه المشاركة بواسطة SandHawk في 4 يناير 2010 في 17:39

−1
#11

حتى و ان كان هناك فروق في السرعة فهي فروق هامشية أكثر مما تتخيل اذا ما قارنتها باشياء أخرى مثل الPage Faults

مصري في بلاد الفرنجة.

قريباً اقرأ مقالاتي على It-scoop

#12

الحمد لله اشتريت رام جديدة اليوم

الفجوال ستوديو 2008 يشتغل كالبرق الان :P

وجدت خاصية Debug ضغطت Start Debug فقام باضهار نافدتين تحت ونفد البرنامج لكن لم يضهر شيئ :blink: شغال البرنامج عادي

كيف ممكن اطلع على كود الاسمبلي والمسجلات والستاك ...

امر اخر لاحظته في الفجوال ستوديو

ما هو دور هدا الملف targetver.h

#pragma once


#ifndef _WIN32_WINNT            
#define _WIN32_WINNT 0x0600     
#endif

اضن ان هده اوامر الـPreprocessor للتعرف على نضام التشغيل ؟

تم تعديل هذه المشاركة بواسطة soufianosse في 4 يناير 2010 في 23:29

#13

نسيت وضع breakpoints.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#14

رائع جدا هدا الـDebugger :ohmy:

يعرض كود سي وكود الاسمبلي المقابل له هدا جميل جدا جدا :lol:

#15

هناك مشكل واحد هو التنقل الى عنوان اخر

متلا في هدا السطر

00411423  call        dword ptr [__imp__printf (4182C8h)]

اريد الدهاب الى العنوان 4182C8h

هل من طريقة مباشرة

مواضيع مشابهة