मैं कार्ड संयोजन स्कोर (7 में से 5 सर्वश्रेष्ठ कार्ड) प्राप्त करने के लिए "रेडब्ल्यू हाथ मूल्यांकनकर्ता" दृष्टिकोण का उपयोग करने की कोशिश कर रहा हूं। हालांकि मेरे पास इस विधि के साथ प्रदर्शन समस्या है। सूत्रों के मुताबिक - इस दृष्टिकोण का उपयोग प्रति सेकंड 300 मिलियन से अधिक हाथों का मूल्यांकन करना संभव होना चाहिए! मेरा परिणाम 1.5 सेकंड में 10 मिलों है, जो कई बार धीमा है।तेज पोकर हाथ मूल्यांकन
के पीछे "RayW हाथ मूल्यांकनकर्ता" विचार पीछा कर रहा है:
यहाँदो प्लस टू मूल्यांकनकर्ता कुछ तीस-दो मिलियन प्रविष्टियों (32,487,834 सटीक होना करने के लिए) से युक्त एक बड़ी लुकअप तालिका के होते हैं। दिए गए 7-कार्ड पोकर हाथ को देखने के लिए क्रम में, आप इस तालिका के माध्यम से एक पथ का पता लगाते हैं, प्रति कार्ड एक लुकअप करते हैं।
namespace eval { public struct TPTEvaluator { public static int[] _lut; public static unsafe void Init() // to load a table { _lut = new int[32487834]; FileInfo lutFileInfo = new FileInfo("HandRanks.dat"); if (!lutFileInfo.Exists) {throw new Exception("Handranks.dat not found");} FileStream lutFile = new FileStream("HandRanks.dat", FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 4096); byte[] tempBuffer = new byte[32487834 * 4]; lutFile.Read(tempBuffer, 0, 32487834 * 4); fixed (int* pLut = _lut) { Marshal.Copy(tempBuffer, 0, (IntPtr)pLut, 32487834 * 4);} tempBuffer = null; } public unsafe static int LookupHand(int[] cards) // to get a hand strength { fixed (int* pLut = _lut) { int p = pLut[53 + cards[0]]; p = pLut[p + cards[1]]; p = pLut[p + cards[2]]; p = pLut[p + cards[3]]; p = pLut[p + cards[4]]; p = pLut[p + cards[5]]; return pLut[p + cards[6]]; } } }
}
और है कि मैं तरीका बताया गया है: जब आप पिछले कार्ड के लिए मिलता है, इसलिए प्राप्त मूल्य हाथ
की आधिकारिक तुल्यता मूल्य कैसे कोड लग रहा है की तरह है इस दृष्टिकोण का परीक्षण करें:
private void button4_Click(object sender, EventArgs e)
{
int[] str = new int[] { 52, 34, 25, 18, 1, 37, 22 };
int r1 = 0;
DateTime now = DateTime.Now;
for (int i = 0; i < 10000000; i++) // 10 mil iterations 1.5 - 2 sec
{ r1 = TPTEvaluator.LookupHand(str);} // here
TimeSpan s1 = DateTime.Now - now;
textBox14.Text = "" + s1.TotalMilliseconds;
}
मेरा मानना है कि यह विधि मूल रूप से सी ++ में लागू की गई थी, लेकिन एन फिर भी सी # पोर्ट तेजी से काम करना चाहिए। क्या कोई तरीका है कि मैं एक सेकंड में कम से कम 100 लाख हाथों के करीब कैसे पहुंच सकता हूं?
क्या मैं अब तक की कोशिश की:
- स्टेटिक उपयोग करने की कोशिश, और गैर स्थिर तरीकों - कोई फर्क नहीं।
शब्दकोश देखने के बजाय सरणी
public void ArrToDict(int[] arr, Dictionary<int, int> dic) { for (int i = 0; i < arr.Length; i++) { dic.Add(i, arr[i]); } } public unsafe static int LookupHandDict(int[] cards) { int p = dict[53 + cards[0]]; p = dict[p + cards[1]]; p = dict[p + cards[2]]; p = dict[p + cards[3]]; p = dict[p + cards[4]]; p = dict[p + cards[5]]; return dict[p + cards[6]]; }
बीता हुआ समय हाथ के 10 मिलों के लिए लगभग 6 बार धीमी ..
एक व्यक्ति के अनुसार उपयोग करने की कोशिश - वह वृद्धि हुई "असुरक्षित" कोड को हटाकर 200 मिलों द्वारा प्रदर्शन। मैंने एक ही काम करने की कोशिश की लेकिन परिणाम लगभग समान हैं।
सी # संस्करण में "असुरक्षित" कोड भागों और कुछ छोटे समायोजन को हटाने के बाद यह अब भी चारों ओर 310 Mio है:
public static int LookupHand(int[] cards) { int p = _lut[53 + cards[0]]; p = _lut[p + cards[1]]; p = _lut[p + cards[2]]; p = _lut[p + cards[3]]; p = _lut[p + cards[4]]; p = _lut[p + cards[5]]; return _lut[p + cards[6]]; }
यहाँ उद्धरण है।
इस हाथ रैंकिंग प्रणाली के प्रदर्शन को बढ़ाने के लिए किसी भी अन्य तरीका है?
क्या आपने रिलीज़ मोड में चलाने का प्रयास किया है? यह तब तेज प्रदर्शन कर सकता है, क्योंकि कोड अनुकूलित किया गया है। –
.dat फ़ाइल जिसमें इन सभी प्रविष्टियों को शामिल किया गया है, आकार में 130 एमबी है .. फिर भी 1-2 गीगा रैम वाले पी 4 पीसी में कोई समस्या नहीं थी। मेरे पास 4 गीगा हैं, इसलिए राम को एक समस्या नहीं होनी चाहिए। – Alex
@ मिचलबी। यह अब 200 मिलीसेकंड है !! बहुत बहुत धन्यवाद। मैं इस मुद्दे को हटा नहीं पाऊंगा .. हो सकता है कि कुछ और सुधार किए जा सकें .. धन्यवाद, फिर से !! – Alex