2016-04-14 7 views
19

मैं जांच कर रहा हूं कि मेरे कोणीय 2.0 टाइपस्क्रिप्ट प्रोजेक्ट के लिए संकलन समय अपेक्षाकृत कम समय में लगभग 4 सेकंड से लगभग 15 सेकंड तक चला गया।लंबी टाइपस्क्रिप्ट संकलन समय की जांच

मैं बहुत उपयोगी, लेकिन प्रतीत होता है अनियंत्रित --diagnostics स्विच में आया।

उदाहरण के लिए, यहाँ जब अब मेरी परियोजना पर tsc --noEmit --diagnostics चल रहा है कि मैं क्या मिलेगा:

Files:    231 
Lines:   50872 
Nodes:   170067 
Identifiers:  65994 
Symbols:  7712123 
Types:   407677 
Memory used: 600554K 
I/O read:  0.43s 
I/O write:  0.00s 
Parse time:  1.13s 
Bind time:  0.34s 
Check time:  10.17s 
Emit time:  0.00s 
Total time:  11.64s 

यहाँ जब मैं परियोजना के पिछले संस्करण पर एक ही आदेश चला कि मैं क्या मिलता है।

Files:    197 
Lines:   30882 
Nodes:   124208 
Identifiers:  46201 
Symbols:  5856945 
Types:   10989 
Memory used: 80412K 
I/O read:  0.03s 
I/O write:  0.00s 
Parse time:  0.60s 
Bind time:  0.27s 
Check time:  0.93s 
Emit time:  0.00s 
Total time:  1.79s 

Types की संख्या जिस तरह से बढ़ गई है, और इसलिए Check time है।

क्या --diagnostics से अधिक विस्तृत/वर्बोज आउटपुट प्राप्त करना संभव है?

नोडजेएस v4.4.3, टाइपस्क्रिप्ट v1.8.10। यह मेरा tsconfig.json

{ 
    "compilerOptions": { 
    "target": "es5", 
    "module": "system", 
    "moduleResolution": "node", 

    "noImplicitAny": false, 
    "noEmitOnError": false, 

    "experimentalDecorators": true, 

    "emitDecoratorMetadata": true, 
    "removeComments": false 
    }, 
    "exclude": [ 
    "node_modules", 
    "wwwroot", 
    "typings/main.d.ts", 
    "typings/main" 
    ] 
} 

उत्तर

0

संकलक धीमा हो जाना जाता है, आप घड़ी मोड tsc -w में संकलक का उपयोग करें या webpack और ts-loader जो बेनकाब transpileOnly विकल्प (कोई समय लेने वाली चेक) करने के लिए स्विच कर सकते हैं।

+0

धन्यवाद। परिवर्तनों को देखने के लिए हम 'gulp-typecript' (https://www.npmjs.com/package/gulp-typescript) का उपयोग करते हैं। यह वृद्धिशील संकलन का समर्थन करता है। यहां तक ​​कि देखने के साथ, मैं लगातार 12 से 18 सेकंड बनाता है। लेकिन निर्माण तेजी से होता था और इतना नहीं कि इतना कोड जोड़ा गया था और हम अभी शुरू कर रहे हैं। कुछ बदलाव ने इस मुद्दे को जन्म दिया होगा, लेकिन प्रतिबद्धता-प्रति-प्रतिबद्धता खोजने के लिए यह बहुत समय लगेगा। –

+0

मैंने गल्प-टाइपस्क्रिप्ट और अंतर्निहित इंटेलिज आइडिया कंपाइलर की कोशिश की, लेकिन यह बहुत धीमी थी, प्रत्येक बदलाव के लगभग 8 सेकंड बाद, अस्वीकार्य। अब मैं वेबपैक और टीएस-लोडर का उपयोग पारदर्शी विकल्प के साथ कर रहा हूं, रीकंपाइल समय लगभग 0.5 है। – kemsky

13

लगता है कि मुझे अपने मामले में अपराधी मिला है। मैंने इसे कठिन तरीका किया; मेरी प्रक्रिया:

  1. उस प्रतिबद्धता को ढूंढें जो संकलन को धीमा कर देता है। इतिहास प्रतिबद्धता के माध्यम से जाओ और संकलन के समय की जांच करें।
  2. अवरुद्ध रेखाएं मिलने तक परिवर्तित कोड को टिप्पणी करें।

अपमानजनक प्रतिबद्धता से पहले, प्रतिबद्धता के बाद, मुझे लगातार 2-4 सेकंड के संकलन के समय मिलते हैं - 13-17 सेकंड।

मेरे मामले में, मैं एक accessTokenGetter क्षेत्र है, जो निर्माता में प्रारंभ किया गया था के साथ एक वर्ग है,:

export class JwtConfig { 
    //... 
    accessTokenGetter:() => Observable<string>; 
    //... 
     constructor(private config?: IJwtConfig) { 
      // ... 
      this.accessTokenGetter = this.config.accessTokenGetter || (() => Observable.of(null)); 
     } 
} 

प्रारंभ || (() => Observable.of(null)); के दूसरे भाग सुस्ती पैदा कर रहा था। इसे टिप्पणी करते हुए या एक प्रकार की एनोटेशन जोड़ने से संकलन समय वापस आ गया। चूंकि अवलोकन योग्य सामान्य है, ऐसा लगता है कि टाइपस्क्रिप्ट कंपाइलर को कुछ प्रकार के चेक को कम करने के लिए एक संकेत की आवश्यकता है, जिसे इसे करने की आवश्यकता है।

//... 
this.accessTokenGetter = this.config.accessTokenGetter || (() => Observable.of(<string>null)); 
//... 

Observable.of(null as string)) भी काम करने के लिए लगता है: मेरे आरंभीकरण अब के रूप में पढ़ता है। वहां कुछ अन्य स्थान थे जहां एक प्रकार की एनोटेशन स्पीड संकलन जोड़ना था।

उम्मीद है कि यह किसी की मदद करेगा।

फिर भी, यदि कंपाइलर में उत्तर में तेजी से सुविधा है - तो मुझे यह सुनकर खुशी होगी।

+0

धन्यवाद, मुझे एक ही समस्या का सामना करना पड़ा। इसे टालने के लिए सीखने के नियम: जब भी संभव हो 0 प्रकार एनोटेशन जोड़ें –

+0

वाह, यह पागल है। अगर यह धीमा संदर्भों को ट्रैक करने के लिए एक स्वचालित तरीका था तो यह बहुत अच्छा होगा। – bcherny

+1

आप पिटॉट/हालत के रूप में संकलन समय के साथ 'गिट बिसेक्ट' से लाभ उठा सकते हैं। उसमें 1000s काम करने के लिए कुछ ही मिनट लग गए होंगे। सेटअप शायद एक घंटे से भी कम है, और आप इसे भविष्य की जांच के लिए पुनः उपयोग कर सकते हैं – user3041539

0

मेरे मामले में संकलन समय लगभग 15-30 सेकंड था। tsc --noEmit --diagnostics कमांड के बाद मैंने देखा है कि मैं 2k फाइलें बना रहा हूं।समाधान node_modules फ़ोल्डर से सभी फाइलों को बाहर करने के लिए किया गया था:

{ 
    "compilerOptions": {...}, 
    "exclude": [ 
    "node_modules" 
    ] 
} 

यह एक अच्छा विचार भी typings फ़ोल्डर बाहर करने के लिए है।

+0

हां, सहमत हुए। लेकिन जब मैंने अपनी समस्या शुरू की थी तब मैंने दोनों को पहले से ही बाहर कर दिया था। टाइपिंग के संबंध में मैं इतना निश्चित नहीं हूं - इस पर निर्भर करता है कि आपके प्रोजेक्ट को कैसे सेट अप किया गया है, यानी यदि आप ट्रिपल-स्लैश संदर्भ ('/// <संदर्भ ..') का उपयोग नहीं करते हैं, तो आपको एक हिस्सा छोड़ना पड़ सकता है टाइपिंग subtree - जैसा कि मैंने अपने मामले में किया है - मैं केवल नोड ('टाइपिंग/मुख्य') के लिए टाइपिंग को बाहर कर देता हूं। –

3

मैं 15 सेकंड से संकलन प्रक्रिया को तेज कर सकता हूं। 6-7 सेकंड तक टाइपप्रति पुस्तिका से

// slow: 
// ... 
.flatMap((receivedObj: MyType) => { 
    let nextObservable: Observable<MySecondType> = this.dependingPut(receivedObj); 
    return nextObservable || new Observable((observer) => { 
      observer.next(undefined); 
     }); 
}); 


// fast: 
.flatMap((receivedObj: MyType) => { 
    let nextObservable: Observable<MySecondType> = this.dependingPut(receivedObj); 
    return nextObservable || new Observable<MySecondType>((observer) => { // <--- use the generics! 
      observer.next(undefined); 
     }); 
}); 

(https://www.typescriptlang.org/docs/handbook/generics.html): कोड के इस एक लाइन बदलकर

function identity<T>(arg: T): T { 
    return arg; 
} 

// ... 

let output = identity("myString"); // type of output will be 'string' 

"सूचना है कि हम स्पष्ट रूप से कोष्ठक कोण में टाइप पारित करने के लिए नहीं था (<>), कंपाइलर ने केवल "myString" मान को देखा, और अपने प्रकार के लिए टी सेट करें। जबकि कोड कम और अधिक पठनीय रखने के लिए तर्क तर्क सहायक उपकरण हो सकता है, तो आपको स्पष्ट रूप से टाइप तर्कों में पास करते हैं जैसा कि हमने पिछले उदाहरण में किया था जब कंपाइलर प्रकार का अनुमान लगाने में विफल रहता है, जैसा कि अधिक जटिल उदाहरणों में हो सकता है। "

मेरे मामले में यह असफल नहीं हुआ; प्रकार अनुमान ने अभी बहुत लंबा समय लिया (वैसे, यह भी बहुत सारी स्मृति का उपभोग करता है)। वर्कअराउंड बनाने शुरू करने से पहले, अपने संशोधन इतिहास में वापस जाएं और खराब संशोधन की पहचान करने का प्रयास करें। यह सुनिश्चित करने के लिए कि संकलक अपराधी है, --diagnostics विकल्प का उपयोग करें। यदि लौटाए गए आंकड़े उच्च "चेक टाइम" मान लौटाते हैं, तो गायब प्रकारों के लिए अपने कोड का निरीक्षण करें।

1

मेरे लिए, मंदी import "./file.ts"; जैसे आयात के कारण थी। .ts एक्सटेंशन को हटाने से चीज़ें 90% तेज हो जाती हैं: import "./file";

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