java - 1 वर्ष के लिए अप्रत्याशित परिणाम देने वाले कैलेंडर




date calendar dayofweek (2)

दुर्भाग्य से, GregorianCalendar का बुरी तरह नाम है यह वास्तव में "जूलियन / ग्रेगोरीयन कैलेंडर, उनके बीच एक स्विच ओवर है।"

सौभाग्य से, आप उस स्विच-ओवर को समय की शुरुआत में निर्धारित करके शुद्ध ग्रेगोरीयन कैलेंडर के रूप में कार्य करने के लिए इसका उपयोग कर सकते हैं:

GregorianCalendar calendar = new GregorianCalendar();
calendar.setGregorianChange(new Date(Long.MIN_VALUE));

उस समय, आपके वर्तमान कोड के साथ, आपको सिर्फ "4" का उत्तर मिलता है - यह एक ऑफ-बाय-एक्शन के कारण 12 नहीं उठा रहा है ... आपको < 12 बल्कि < 11 बजाय < 11

मैंने जावा 7 में यह कोड-गोल्फ चुनौती करने की कोशिश की। बस किसी के लिए जो पता नहीं है: कोड-गोल्फ एक निश्चित कार्य को पूरा करने के लिए जितना संभव हो उतना बाइट्स है। जाहिर है जावा ऐसा करने के लिए एक उपयुक्त प्रोग्रामिंग भाषा नहीं है, खासकर जेली जैसी भाषाओं के साथ; 05AB1E; Pyth; और समान रूप से जो 1-15 बाइट्स में कार्य पूरा करते हैं जो जावा में 75-300 हो, लेकिन मैं सिर्फ मज़े के लिए करता हूं।

यहाँ मेरा वर्तमान जावा 7 उत्तर है बस संदर्भ के लिए, मैं इसे यहां कॉपी भी करूँगा:

import java.util.*;String c(int y){String r="";Calendar c=Calendar.getInstance();c.set(1,y);c.set(2,0);for(int i=0;i++<11;c.add(2,1)){c.set(5,c.getActualMaximum(5));if(c.get(7)==2)r+=i+" ";}return r;}
import java.util.*;
class M{
  static String c(int year){
    String r = "";
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, 0);
    for(int i = 0; i++ < 11; calendar.add(Calendar.MONTH, 1)){
      calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
      if(calendar.get(Calendar.DAY_OF_WEEK) == 2){
        r += i+" ";
      }
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(1));
    System.out.println(c(297));
    System.out.println(c(1776));
    System.out.println(c(2000));
    System.out.println(c(2016));
    System.out.println(c(3385));
  }
}

जो सभी 1-अनुक्रमित महीनों का उत्पादन करता है, जिनमें से महीने का अंतिम दिन सोमवार है:

1 2 10 **
5 
9 
1 7 
2 10 
1 2 10

जैसा कि आप ध्यान दें कि जब आप अपने परिणामों की तुलना संबंधित चुनौती में करते हैं, तो वर्ष 1 के परिणाम गलत हैं।
क्या किसी को पता है क्यों? मूल रूप से मैंने सोचा कि calendar.getInstance Calendar.getInstance() रूप में गलत कैलेंडर डिफ़ॉल्ट है, इसलिए मैंने इसे चुनौती में निर्दिष्ट के रूप में new GregorianCalendar() Calendar.getInstance() में बदल दिया। लेकिन मुझे एहसास हुआ कि यह डिफ़ॉल्ट कैलेंडर पहले से है

साल 1 के लिए गलत परिणाम क्यों हैं?


प्रदर्शन

प्रदर्शन एक अस्पष्ट शब्द है यदि आप प्रदर्शन से क्या मतलब परिभाषित नहीं करते हैं, यदि यह सादा गणना प्रदर्शन है तो गणना की प्रकृति के आधार पर ज़ैमरिन जावा से तेज हो सकती है।

एंड्रॉइड नेटिवली कोड को निष्पादित करने के लिए मल्टी फॉर्म के साथ आता है:

  • रेंडरस्क्रिप्ट (सीपीयू और जीपीयू)
  • जावा (एसडीके)
  • सी ++ (एनडीके)
  • ओपनजीएल (जीपीयू)

यह स्पष्ट है कि कोड को निष्पादित करते समय समाधान जितना तेज़ होगा उतना तेज़ होगा। एक रन-टाइम आधारित भाषा कभी भी ऐसी भाषा को नहीं हराएगी जो सीपीयू पर सीधे चलती है।

लेकिन दूसरी तरफ यदि आप वास्तविक जीवन उपयोग प्रदर्शन को मापना चाहते हैं तो जावा एक्सपेरिन तेज़ी से तेजी से जा रहा है।

Xamarin और यह धीमा क्यों हो सकता है

सादा पुराने जावा अनुप्रयोगों के साथ ज़ैमरिन की तुलना करते समय, एक्समरिन के लिए प्रदर्शन बहुत तेज हो सकता है क्योंकि यह धीमा हो सकता है।

वास्तविक दुनिया में उदाहरण के लिए ज़ैमरिन अनुप्रयोग जावा अनुप्रयोगों की तुलना में धीमे होने की संभावना है क्योंकि कई एंड्रॉइड / जावा (सिस्टम) कॉलों को तथाकथित बाइंडिंग का उपयोग करके ज़ैमरिन रन-टाइम से और उसके लिए प्रतिनिधि होने की आवश्यकता होती है।

कुछ अलग-अलग प्रकार के बाइंडिंग हैं जो जानना महत्वपूर्ण हैं:

  • जेएनआई (जावा नेटिव इंटरफेस): बाइंडिंग जावा कोड (एसडीके) और देशी सी ++ कोड (एनडीके) के बीच इंटरफेस करने के लिए कई एंड्रॉइड अनुप्रयोगों में उपयोग किया जाता है।
  • एमसीडब्ल्यू (प्रबंधित कॉल करने योग्य लपेटें): एक बाध्यकारी जो एक्समेरिन में प्रबंधित सी # कोड से जावा कोड (एंड्रॉइड रन-टाइम) से इंटरफेस करने के लिए उपलब्ध है।
  • एसीडब्ल्यू (एंड्रॉइड कॉल करने योग्य रैपर): एक बाध्यकारी जो जावा कोड (एंड्रॉइड रन-टाइम) से प्रबंधित सी # कोड में इंटरफेस करने के लिए ज़ैमरिन में उपलब्ध है।

यहां एमसीडब्ल्यू और एसीडब्ल्यू पर अधिक जानकारी: https://developer.xamarin.com/guides/cross-platform/application_fundamentals/building_cross_platform_applications/part_1_-_understanding_the_xamarin_mobile_platform/

बाइंडिंग प्रदर्शन के मामले में बहुत महंगा है। जावा से सी ++ विधि को आमंत्रित करने से कॉलिंग समय में एक बड़ा ओवरहेड जोड़ता है, सी ++ के भीतर से सी ++ विधि को कॉल करना कई बार तेज़ होता है।

किसी ने जेएनआई कॉल लागत पर औसतन कितने जावा ऑपरेशंस की गणना करने के लिए प्रदर्शन परीक्षण किया: जेएनआई कॉल करने के मात्रात्मक ओवरहेड क्या है?

लेकिन न केवल जेएनआई कॉल महंगे हैं इसलिए एमसीडब्ल्यू और एसीडब्ल्यू से कॉल करने के लिए कहा जाता है। वास्तविक दुनिया Xamarin अनुप्रयोग बाइंडिंग का उपयोग करके कई कॉल करते हैं और Xamarin एप्लिकेशन के इस असली दुनिया के उपयोग के कारण एक सादे पुराने जावा एप्लिकेशन की तुलना में धीमे (और सामान्य रूप से) धीमे हो सकते हैं। हालांकि Xamarin एप्लिकेशन को डिज़ाइन किए जाने के तरीके के आधार पर यह बहुत संभावना है कि उपयोगकर्ता अंतर को भी ध्यान में रखेगा।

टीएलडीआर / निष्कर्ष: Xamarin को अल-प्रकार के बाइंडिंग का उपयोग करने की आवश्यकता है, जो कि समय पर महंगा है।

बाइंडिंग के अलावा, वास्तविक दुनिया के प्रदर्शन के बारे में बात करते समय कई अन्य कारक शामिल हैं, उदाहरण के लिए: द्विआधारी का आकार, स्मृति में ऐप लोड करना, I / O संचालन और कई अन्य। इनमें से कुछ चीजों की जांच करने वाला एक ब्लॉग पोस्ट यहां पाया जा सकता है: https://magenic.com/thinking/mobile-development-platform-performance-part-2-native-cordova-classic-xamarin-xamarin-forms





java date calendar dayofweek