আমি ঠিক পাইথন 3 ব্যবহার করে আপনার মত একই মানদণ্ড চালিয়েছি:
$ docker run python:3-alpine3.6 python --version
Python 3.6.2
$ docker run python:3-slim python --version
Python 3.6.2
2 সেকেন্ডের বেশি পার্থক্য সৃষ্টি করে:
$ docker run python:3-slim python -c "$BENCHMARK"
3.6475560404360294
$ docker run python:3-alpine3.6 python -c "$BENCHMARK"
5.834922112524509
আল্পাইন মসল প্রকল্প ( আয়না ইউআরএল ) libc
থেকে (বেস সিস্টেম লাইব্রেরি) আলাদা প্রয়োগকরণ ব্যবহার করছে । এই লাইব্রেরির মধ্যে অনেক পার্থক্য রয়েছে । ফলস্বরূপ, প্রতিটি গ্রন্থাগার নির্দিষ্ট ব্যবহারের ক্ষেত্রে আরও ভাল সম্পাদন করতে পারে।
উপরের এই কমান্ডগুলির মধ্যে একটি স্ট্রেসের পার্থক্য রয়েছে । আউটপুটটি 269 লাইন থেকে পৃথক হতে শুরু করে Of অবশ্যই মেমরিতে বিভিন্ন ঠিকানা রয়েছে তবে অন্যথায় এটি খুব মিল। বেশিরভাগ সময় স্পষ্টতই python
কমান্ডটি শেষ হওয়ার অপেক্ষায় ব্যয় হয়।
strace
উভয় পাত্রে ইনস্টল করার পরে , আমরা আরও আকর্ষণীয় ট্রেস পেতে পারি (আমি বেঞ্চমার্কে পুনরাবৃত্তির সংখ্যা হ্রাস করে 10)।
উদাহরণস্বরূপ, glibc
নিম্নলিখিত পদ্ধতিতে লাইব্রেরিগুলি লোড করা হচ্ছে (লাইন 182):
openat(AT_FDCWD, "/usr/local/lib/python3.6", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
getdents(3, /* 205 entries */, 32768) = 6824
getdents(3, /* 0 entries */, 32768) = 0
একই কোড musl
:
open("/usr/local/lib/python3.6", O_RDONLY|O_DIRECTORY|O_CLOEXEC) = 3
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
getdents64(3, /* 62 entries */, 2048) = 2040
getdents64(3, /* 61 entries */, 2048) = 2024
getdents64(3, /* 60 entries */, 2048) = 2032
getdents64(3, /* 22 entries */, 2048) = 728
getdents64(3, /* 0 entries */, 2048) = 0
আমি বলছি না এটি মূল পার্থক্য, তবে মূল গ্রন্থাগারে আই / ও অপারেশন সংখ্যা হ্রাস করা আরও ভাল পারফরম্যান্সে অবদান রাখতে পারে contribute ভিন্নতা থেকে আপনি দেখতে পাচ্ছেন যে খুব একই পাইথন কোডটি কার্যকর করা কিছুটা ভিন্ন ভিন্ন সিস্টেমের কল হতে পারে। লুপ পারফরম্যান্সকে অনুকূলকরণের ক্ষেত্রে সম্ভবত সবচেয়ে গুরুত্বপূর্ণটি করা যেতে পারে। পারফরম্যান্স ইস্যু মেমরি বরাদ্দ বা অন্য কোনও নির্দেশের কারণে হয়েছে কিনা তা বিচার করার পক্ষে আমি যথেষ্ট যোগ্য নই।
glibc
10 পুনরাবৃত্তি সহ:
write(1, "0.032388824969530106\n", 210.032388824969530106)
musl
10 পুনরাবৃত্তি সহ:
write(1, "0.035214247182011604\n", 210.035214247182011604)
musl
0.0028254222124814987 সেকেন্ডের দ্বারা ধীর। পুনরাবৃত্তির সংখ্যার সাথে পার্থক্যটি বাড়ার সাথে সাথে আমি ধরে নেব যে পার্থক্যটি JSON অবজেক্টের মেমরি বরাদ্দে রয়েছে।
আমরা যদি কেবলমাত্র আমদানি করতে মানদণ্ডকে হ্রাস json
করি তবে লক্ষ্য করি পার্থক্যটি এত বিশাল নয়:
$ BENCHMARK="import timeit; print(timeit.timeit('import json;', number=5000))"
$ docker run python:3-slim python -c "$BENCHMARK"
0.03683806210756302
$ docker run python:3-alpine3.6 python -c "$BENCHMARK"
0.038280246779322624
পাইথন লাইব্রেরি লোড করা তুলনামূলক দেখায়। জেনারেট list()
বড় পার্থক্য সৃষ্টি করে:
$ BENCHMARK="import timeit; print(timeit.timeit('list(range(10000))', number=5000))"
$ docker run python:3-slim python -c "$BENCHMARK"
0.5666235145181417
$ docker run python:3-alpine3.6 python -c "$BENCHMARK"
0.6885563563555479
স্পষ্টতই সর্বাধিক ব্যয়বহুল অপারেশন হ'ল এটি json.dumps()
গ্রন্থাগারগুলির মধ্যে মেমরি বরাদ্দের পার্থক্যের দিকে নির্দেশ করতে পারে।
মাপদণ্ডের দিকে আবার তাকানো ,
musl
মেমরি বরাদ্দে সত্যই কিছুটা ধীর:
musl | glibc
-----------------------+--------+--------+
Tiny allocation & free | 0.005 | 0.002 |
-----------------------+--------+--------+
Big allocation & free | 0.027 | 0.016 |
-----------------------+--------+--------+
আমি নিশ্চিত না যে "বড় বরাদ্দ" বলতে কী বোঝায়, তবে musl
এটি প্রায় 2 × ধীর, যা আপনি যখন হাজার হাজার বা কয়েক মিলিয়ন বার এই ক্রিয়াকলাপগুলি পুনরাবৃত্তি করবেন তখন তা গুরুত্বপূর্ণ হয়ে উঠতে পারে।