StringTokenizer 와 String.split() 의 속도 차이와 그 이유

StringTokenizer는 느릴까? 실험하기

StringTokenizer 관련 StackOverflow 게시글

무엇이 더 빠른가? 🏃‍♂️

속도 차이가 왜 생기나? 🤷‍♂️

실험 결과 비교하기

  1. 첫번째 실험 : 구분자를 “,” 사용 / hasMoreTokens() 사용 안함 / nextToken() 한번 사용

    1. 결과 :
    splits ====== time : 271, clientIp : 192.168.1.1
    tokenizer ====== time : 80, clientIp : 192.168.1.1
    [출처] [StringTokenizer VS String.split] 누가 더 빠른가|작성자 평범한개발자
    
  2. 두번째 실험 : 구분자를 아스키코드가 아닌 문자 사용 / hasMoreTokens(), nextToken() 반복 사용

    1. 코드 :

    StringTokenizer 와 String.split() 의 속도 차이와 그 이유

    // 위 링크에서 코드 발췌
    @Test
    	public void getClientIpSplitTest() {
    		
    		String clientIp = null;
    		
    		long start = System.currentTimeMillis();
    		for(int i = 0; i < 1000000; i++) {
    			
    			String xForwardedFor="192.168.1.1뛟127.0.0.1뛟127.0.0.2뛟127.0.0.3";
    			String[] splits = xForwardedFor.split("뛟");
    			if(splits.length < 1) clientIp = "";
    			else {
    				for(String str : splits) {
    					clientIp = str;
    				}
    			}
    		}
    		long end = System.currentTimeMillis();
    
    		log.info("splits ====== time : {}, clientIp : {}", end-start, clientIp);
    	}
    	
    	
    	@Test
    	public void getClientIpStringTokenizerTest() {
    		
    		String clientIp = null;
    		
    		long start = System.currentTimeMillis();
    		for(int i = 0; i < 1000000; i++) {
    			
    			
    			String xForwardedFor="192.168.1.1뛟127.0.0.1뛟127.0.0.2뛟127.0.0.3";
    			StringTokenizer tokenizer = new StringTokenizer(xForwardedFor, "뛟");
    			while(tokenizer.hasMoreTokens()) {
    				clientIp = tokenizer.nextToken();
    			}
    			
    			if(clientIp == null) clientIp = "";
    		}
    		long end = System.currentTimeMillis();
    		log.info("tokenizer ====== time : {}, clientIp : {}", end-start, clientIp);
    
    	}
    [출처] [StringTokenizer VS String.split] 누가 더 빠른가|작성자 평범한개발자
    

    b. 결과 : 차이가 갑자기 확 좁혀졌다

    splits ====== time : 257, clientIp : 127.0.0.3 
    tokenizer ====== time : 220, clientIp : 127.0.0.3
    [출처] [StringTokenizer VS String.split] 누가 더 빠른가|작성자 평범한개발자
    
  3. 세번째 실험 : 두번째 실험에서 구분자 “하나” 추가 / hasMoreTokens(), nextToken() 반복 사용

    1. 결과 : 역전 당했다. 효율이 정말 좋지 않아보인다.
    "192.168.1.1뛟127.0.0.1뛟127.0.0.2뛟127.0.0.3뛟127.0.0.4";
    
    splits ====== time : 270, clientIp : 127.0.0.4
    tokenizer ====== time : 319, clientIp : 127.0.0.4 
    [출처] [StringTokenizer VS String.split] 누가 더 빠른가|작성자 평범한개발자