कॉलोक की तुलना में malloc+memset धीमा क्यों है?




(2)

कुछ मोड में कुछ प्लेटफॉर्म पर मैलोक इसे वापस करने से पहले कुछ आम तौर पर शून्य-शून्य मान को याद करता है, इसलिए दूसरा संस्करण स्मृति को दो बार शुरू कर सकता है

यह ज्ञात है कि calloc से अलग है जिसमें यह आवंटित स्मृति को प्रारंभ करता है। calloc साथ, स्मृति शून्य पर सेट है। malloc साथ, स्मृति को मंजूरी नहीं दी जाती है।

तो रोजमर्रा के काम में, मैं calloc को memset + memset रूप में मानता memset । संयोग से, मस्ती के लिए, मैंने एक बेंचमार्क के लिए निम्नलिखित कोड लिखा था।

नतीजा भ्रमित है।

कोड 1:

#include<stdio.h>
#include<stdlib.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
        int i=0;
        char *buf[10];
        while(i<10)
        {
                buf[i] = (char*)calloc(1,BLOCK_SIZE);
                i++;
        }
}

कोड 1 का आउटपुट:

time ./a.out  
**real 0m0.287s**  
user 0m0.095s  
sys 0m0.192s  

कोड 2:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
        int i=0;
        char *buf[10];
        while(i<10)
        {
                buf[i] = (char*)malloc(BLOCK_SIZE);
                memset(buf[i],'\0',BLOCK_SIZE);
                i++;
        }
}

कोड 2 का आउटपुट:

time ./a.out   
**real 0m2.693s**  
user 0m0.973s  
sys 0m1.721s  

कोड 2 में bzero(buf[i],BLOCK_SIZE) साथ memset को प्रतिस्थापित करना एक ही परिणाम उत्पन्न करता है।

मेरा सवाल है: memset की तुलना में calloc + memset इतनी धीमी क्यों है? calloc कैसे कर सकता है?


क्योंकि कई प्रणालियों पर, अतिरिक्त प्रोसेसिंग समय में, ओएस अपने आप को शून्य पर मुफ्त मेमोरी सेट करने और calloc() लिए सुरक्षित चिह्नित करने के लिए चला जाता है, इसलिए जब आप calloc() कॉल करते हैं, तो आपके पास पहले से ही मुफ्त, शून्य वाली मेमोरी हो सकती है ।







malloc