2010-05-13 12 views
6

मैं एक विधिजावा: रक्षात्मक रूप से एक int [] की प्रतिलिपि बनाने का सबसे प्रभावी तरीका?

int[] getRawData(); 

विभिन्न कारणों के लिए के साथ एक अंतरफलक DataSeries है (मुख्य रूप से, क्योंकि मैं MATLAB के साथ इस का उपयोग कर रहा है, और MATLAB हैंडल int [] अच्छी तरह से) मैं एक सूची के बजाय एक सरणी वापस जाने के लिए की जरूरत है।

मैं नहीं चाहता कि मेरी कार्यान्वयन कक्षाएं int [] सरणी लौटें क्योंकि यह उत्परिवर्तनीय है। Int [] सरणी (1000-1000000 लंबाई सीमा में आकार) की प्रतिलिपि बनाने का सबसे प्रभावी तरीका क्या है? क्या यह clone() है?

उत्तर

7

एकमात्र विकल्प Arrays#copyOf() है (जो हुड के नीचे System#arrayCopy() का उपयोग करता है)।

बस इसका परीक्षण करें।

package com.stackoverflow.q2830456; 

import java.util.Arrays; 
import java.util.Random; 

public class Test { 

    public static void main(String[] args) throws Exception { 
     Random random = new Random(); 
     int[] ints = new int[100000]; 
     for (int i = 0; i < ints.length; ints[i++] = random.nextInt()); 

     long st = System.currentTimeMillis(); 
     test1(ints); 
     System.out.println(System.currentTimeMillis() - st); 

     st = System.currentTimeMillis(); 
     test2(ints); 
     System.out.println(System.currentTimeMillis() - st); 
    } 

    static void test1(int[] ints) { 
     for (int i = 0; i < ints.length; i++) { 
      ints.clone(); 
     } 
    } 

    static void test2(int[] ints) { 
     for (int i = 0; i < ints.length; i++) { 
      Arrays.copyOf(ints, ints.length); 
     } 
    } 

} 
 
20203 
20131 

और जब test1() और test2() लगा दिया जाता था:

 
20157 
20275 

अंतर नगण्य है। मैं कहूंगा, बस clone() के लिए जाएं क्योंकि यह बेहतर पठनीय है और Arrays#copyOf() केवल जावा 6 है।

नोट: वास्तविक परिणाम मंच पर निर्भर हो सकता है और JVM इस्तेमाल किया, यह इंटेल P8400, 4GB PC2-6400 रैम, WinXP के साथ एक Dell अक्षांश E5500 पर परीक्षण किया गया था, JDK 1.6.0_17_b04

+0

वास्तव में अजीब ... मैंने जो लेख पोस्ट किया है, उसकी प्रतिलिपि है क्लोन की तुलना में 2x धीमी गति से घड़ी .. दुख की बात है कि मेरे पास इस मशीन पर जेडीके नहीं है या मैं खुद को एक परीक्षण चलाने में सक्षम हूं। लेकिन वैसे भी अपना खुद का परीक्षण करने के लिए +1। – jonathanasdf

+0

मुझे इसे मारो। बस अपना खुद का परीक्षण चलाने वाला था। @ बालुससी, अगर यह यादृच्छिक मूल्यों के साथ चलाया जाता है तो क्या होगा? उम्मीद न करें कि यह वास्तव में कोई फर्क नहीं पड़ेगा, लेकिन जिस सरणी को आप क्लोनिंग कर रहे हैं वह समान रूप से वितरित किया जाता है। – Finbarr

+1

@ जोनाथन: मई प्लेटफार्म और जेवीएम पर निर्भर हो सकता है। – BalusC

1

http://www.javapractices.com/topic/TopicAction.do?Id=3

संख्या होने की संभावना अपने ऐनक के आधार पर अलग-अलग हो, लेकिन लगता है क्लोन सबसे अच्छा विकल्प है जाएगा।

+2

जो भी लिखा है वह microbenchmarking को समझ में नहीं आता है। –

7
  1. नहीं किसी ने कभी भी एपकोपी() कॉल को क्लोन() या इसके विपरीत कॉल करके अपने ऐप की प्रदर्शन समस्याओं का समाधान किया।

  2. इस प्रश्न का कोई भी निश्चित उत्तर नहीं है। यह सिर्फ इतना नहीं है कि विभिन्न वीएम, संस्करण, ऑपरेटिंग सिस्टम और हार्डवेयर पर भिन्न हो: यह वास्तव में अलग है।

  3. मैं (हाल ही में एक ubuntu पर) वैसे भी यह बेंचमार्क, एक बहुत ही हाल OpenJDK पर और पाया कि arraycopyज्यादा तेज है। तो क्या यह मेरा जवाब है? नहीं! क्योंकि अगर यह सच साबित होता है, तो Arrays.copyOf के अंतर्निहितता के साथ एक बग है, और वह बग निश्चित रूप से तय हो जाएगा, इसलिए यह जानकारी केवल आपके लिए क्षणिक है।

संबंधित मुद्दे