@ জিমওয়াইজের দুর্দান্ত হার্ডওয়্যার / সেটআপ টিউনিংয়ের উত্তর ছাড়াও, "লো লেটেন্সি লিনাক্স" ইঙ্গিত করছে:
- সি ++ নির্ধারণের কারণে (জিসি কিক লাগানোর সময় কোনও আশ্চর্য বিলম্ব না করে), নিম্ন-স্তরের সুবিধাগুলিতে অ্যাক্সেস (আই / ও, সিগন্যাল), ভাষা শক্তি (টিএমপি এবং এসটিএল এর সম্পূর্ণ ব্যবহার, টাইপ সুরক্ষা)।
- গতি-ওভার-মেমরিটিকে পছন্দ করুন:> 512 গিগাবাইট র্যাম সাধারণ; ডাটাবেসগুলি হ'ল মেমরি, ক্যাশেড আপ-ফ্রন্ট বা বিদেশী নোএসকিউএল পণ্য।
- অ্যালগরিদম পছন্দ: যত তাড়াতাড়ি সম্ভব বোধগম্য / বোধগম্য / এক্সটেনসিবল, যেমন লক-ফ্রি, একাধিক বিট অ্যারে-বিন-বৈশিষ্ট্যযুক্ত-অ্যারে-অফ-অবজেক্টস-এর পরিবর্তে একাধিক বিট অ্যারে।
- ওএস সুবিধাগুলির সম্পূর্ণ ব্যবহার যেমন বিভিন্ন কোরে প্রক্রিয়াগুলির মধ্যে ভাগ করা মেমরি।
- নিরাপদ. এইচএফটি সফ্টওয়্যারটি সাধারণত স্টক এক্সচেঞ্জে সহ-অবস্থিত তাই ম্যালওয়্যার সম্ভাবনা অগ্রহণযোগ্য।
এর মধ্যে অনেকগুলি কৌশল গেমস বিকাশের সাথে ওভারল্যাপ করেছে যা আর্থিক সফ্টওয়্যার শিল্পটি সম্প্রতি যে কোনও রিডানডেন্ট গেমস প্রোগ্রামারগুলিকে শোষণ করে (কমপক্ষে তাদের ভাড়া বকেয়া পরিশোধ না করা পর্যন্ত) one
অন্তর্নিহিত প্রয়োজনটি হ'ল সুরক্ষার (স্টক, পণ্য, এফএক্স) দামের মতো বাজারের ডেটাগুলির একটি খুব উচ্চ ব্যান্ডউইথ স্ট্রিম শুনতে এবং তারপরে সুরক্ষা, দামের উপর ভিত্তি করে খুব দ্রুত কেনা / বিক্রয় / কিছুই-না-নেওয়া সিদ্ধান্ত নিতে সক্ষম হয় এবং বর্তমান হোল্ডিংস।
অবশ্যই, এগুলিও দর্শনীয়ভাবে ভুল হতে পারে।
সুতরাং আমি বিট অ্যারে পয়েন্টটি বিস্তারিতভাবে করব । ধরা যাক আমাদের একটি উচ্চ ফ্রিকোয়েন্সি ট্রেডিং সিস্টেম রয়েছে যা অর্ডারের দীর্ঘ তালিকায় কাজ করে (5 কে আইবিএম কিনুন, 10 কে ডিল বিক্রয় করুন) ইত্যাদি। আসুন বলি যে আমাদের সমস্ত আদেশ পূরণ হয়েছে কিনা তাড়াতাড়ি নির্ধারণ করা দরকার, যাতে আমরা পরবর্তী কাজটিতে যেতে পারি। Traditionalতিহ্যবাহী ওও প্রোগ্রামিংয়ে, এটি দেখতে দেখতে যাচ্ছে:
class Order {
bool _isFilled;
...
public:
inline bool isFilled() const { return _isFilled; }
};
std::vector<Order> orders;
bool needToFillMore = std::any_of(orders.begin(), orders.end(),
[](const Order & o) { return !o.isFilled(); } );
এটি একটি রৈখিক স্ক্যান হওয়ায় এই কোডটির অ্যালগোরিদমিক জটিলতা ও (এন) হতে চলেছে। আসুন মেমরি অ্যাক্সেসের ক্ষেত্রে পারফরম্যান্সের প্রোফাইলটি একবার দেখে নিই: স্ট্যান্ডের অভ্যন্তরে লুপের প্রতিটি পুনরাবৃত্তি :: যেকোন_ফ () ও.আইএসফিলড () ইনলাইনড থাকে, তাই মেমরি অ্যাক্সেসে পরিণত হয়, 1 বাইট (অথবা 4 আপনার আর্কিটেকচার, সংকলক এবং সংকলক সেটিংসের উপর নির্ভরশীল) এর 128 বাইট মোট বলুন object সুতরাং আমরা প্রতি 128 বাইটে 1 বাইট অ্যাক্সেস করছি। যখন আমরা 1 বাইট পড়ি, নিকৃষ্টতম অবস্থা অনুমান করে, আমরা একটি সিপিইউ ডেটা ক্যাশে মিস করব। এটি কেবলমাত্র 8 টি বিট পড়ার জন্য র্যামের কাছে একটি রিড অনুরোধ সৃষ্টি করবে যা র্যাম থেকে একটি সম্পূর্ণ লাইন পড়ে ( আরও তথ্যের জন্য এখানে দেখুন )। সুতরাং মেমরি অ্যাক্সেস প্রোফাইলটি এন এর সমানুপাতিক is
এর সাথে তুলনা করুন:
const size_t ELEMS = MAX_ORDERS / sizeof (int);
unsigned int ordersFilled[ELEMS];
bool needToFillMore = std::any_of(ordersFilled, &ordersFilled[ELEMS+1],
[](int packedFilledOrders) { return !(packedOrders == 0xFFFFFFFF); }
এর মেমরি অ্যাক্সেস প্রোফাইল, আবার খারাপ পরিস্থিতি ধরে ধরে, ELEMS কে একটি র্যাম লাইনের প্রস্থ দ্বারা বিভক্ত করা হয় (পরিবর্তিত হয় - ডুয়াল-চ্যানেল বা ট্রিপল-চ্যানেল ইত্যাদি হতে পারে)।
সুতরাং, বাস্তবে, আমরা মেমরি অ্যাক্সেস নিদর্শনগুলির জন্য অ্যালগরিদমগুলি অনুকূল করে তুলছি। কোনও পরিমাণ র্যাম সহায়তা করবে না - এটি সিপিইউ ডেটা ক্যাশে আকার যা এই প্রয়োজনের কারণ করে।
এটা কি সাহায্য করে?
ইউটিউবে লো-লেটেন্সি প্রোগ্রামিং (এইচএফটির জন্য) সম্পর্কে একটি দুর্দান্ত সিপিপিকন রয়েছে: https://www.youtube.com/watch?v=NH1Tta7purM