$lang['tuto'] = "টিউটোরিয়াল"; ?>$lang['tuto'] = "টিউটোরিয়াল"; ?> কার্যকরভাবে JMH

কার্যকরভাবে JMH বেঞ্চমার্কে মেমরি সঞ্চয়ন পরিচালনা করা

কার্যকরভাবে JMH বেঞ্চমার্কে মেমরি সঞ্চয়ন পরিচালনা করা
কার্যকরভাবে JMH বেঞ্চমার্কে মেমরি সঞ্চয়ন পরিচালনা করা

জাভা বেঞ্চমার্কে মেমরি চ্যালেঞ্জ বোঝা

জাভাতে বেঞ্চমার্কিং আপনার কোডের পারফরম্যান্সের সূক্ষ্মতা প্রকাশ করে একটি আলোকিত অভিজ্ঞতা হতে পারে। যাইহোক, অপ্রত্যাশিত সমস্যা, যেমন পুনরাবৃত্তির মধ্যে মেমরি জমা হওয়া, ফলাফলগুলিকে অবিশ্বস্ত করতে পারে। 😓

জাভা মাইক্রোবেঞ্চমার্ক হারনেস (JMH) এর মতো টুল ব্যবহার করে, আপনি পুনরাবৃত্তি জুড়ে হিপ মেমরি ব্যবহারে ধীরে ধীরে বৃদ্ধি লক্ষ্য করতে পারেন। এই আচরণটি বিভ্রান্তিকর পরিমাপের দিকে নিয়ে যেতে পারে, বিশেষ করে যখন হিপ মেমরি প্রোফাইল করা হয়। সমস্যাটি অস্বাভাবিক নয়, তবে এটি বেঞ্চমার্কগুলিকে ব্যাহত না করা পর্যন্ত এটি প্রায়শই উপেক্ষা করা হয়।

এই বাস্তব-জীবনের পরিস্থিতি বিবেচনা করুন: আপনি হিপ মেমরি ব্যবহার বিশ্লেষণ করতে JMH বেঞ্চমার্ক চালাচ্ছেন। প্রতিটি ওয়ার্মআপ এবং পরিমাপ পুনরাবৃত্তি একটি ক্রমবর্ধমান বেসলাইন মেমরি পদচিহ্ন দেখায়। চূড়ান্ত পুনরাবৃত্তি দ্বারা, ব্যবহৃত স্তূপ উল্লেখযোগ্যভাবে বৃদ্ধি পেয়েছে, ফলাফলগুলিকে প্রভাবিত করে। কারণ সনাক্ত করা চ্যালেঞ্জিং, এবং এটি সমাধানের জন্য সুনির্দিষ্ট পদক্ষেপের প্রয়োজন।

এই গাইড JMH বেঞ্চমার্কে এই ধরনের মেমরি সমস্যাগুলি কমানোর জন্য ব্যবহারিক কৌশলগুলি অন্বেষণ করে। উদাহরণ এবং সমাধানগুলি থেকে অঙ্কন করে, এটি অন্তর্দৃষ্টি প্রদান করে যা কেবল মেমরির ব্যবহারকে স্থিতিশীল করে না বরং বেঞ্চমার্কিং নির্ভুলতাও উন্নত করে। 🛠️ কীভাবে এই অসুবিধাগুলি এড়ানো যায় এবং আপনার মানদণ্ড বিশ্বস্ত তা নিশ্চিত করতে আমাদের সাথেই থাকুন।

আদেশ ব্যবহারের উদাহরণ
@Setup(Level.Iteration) JMH-এ এই টীকাটি বেঞ্চমার্কের প্রতিটি পুনরাবৃত্তির আগে কার্যকর করার একটি পদ্ধতি নির্দিষ্ট করে, যা System.gc() এর সাথে মেমরির মতো স্টেট রিসেট করার জন্য আদর্শ করে তোলে।
ProcessBuilder জাভাতে অপারেটিং সিস্টেম প্রক্রিয়া তৈরি এবং পরিচালনা করতে ব্যবহৃত হয়। আলাদা JVM দৃষ্টান্তে চালু করে বেঞ্চমার্কগুলিকে বিচ্ছিন্ন করার জন্য অপরিহার্য।
System.gc() স্তূপ মেমরি জমা কমাতে আবর্জনা সংগ্রহ করতে বাধ্য করে। পুনরাবৃত্তির মধ্যে মেমরি অবস্থা পরিচালনার জন্য দরকারী, যদিও এর আহ্বান নিশ্চিত করা হয় না।
@Fork(value = 1, warmups = 1) JMH বেঞ্চমার্কে ফর্কের সংখ্যা (স্বাধীন JVM দৃষ্টান্ত) এবং ওয়ার্মআপ পুনরাবৃত্তি নিয়ন্ত্রণ করে। মেমরি আচরণ বিচ্ছিন্ন করার জন্য গুরুত্বপূর্ণ।
Runtime.getRuntime().totalMemory() JVM-এ বর্তমানে উপলব্ধ মোট মেমরি নিয়ে আসে। বেঞ্চমার্কিংয়ের সময় মেমরি ব্যবহারের প্রবণতা নিরীক্ষণ করতে সহায়তা করে।
Runtime.getRuntime().freeMemory() JVM-এ বিনামূল্যের মেমরির পরিমাণ ফেরত দেয়, নির্দিষ্ট ক্রিয়াকলাপের সময় মেমরির পরিমাণ গণনা করার অনুমতি দেয়।
assertTrue() ইউনিট পরীক্ষায় শর্ত বৈধ করার জন্য একটি JUnit পদ্ধতি। পুনরাবৃত্তি জুড়ে সামঞ্জস্যপূর্ণ মেমরি ব্যবহার যাচাই করতে এখানে ব্যবহৃত হয়।
@BenchmarkMode(Mode.Throughput) বেঞ্চমার্কের মোড সংজ্ঞায়িত করে। "থ্রুপুট" একটি নির্দিষ্ট সময়ের মধ্যে সম্পন্ন অপারেশনের সংখ্যা পরিমাপ করে, কর্মক্ষমতা প্রোফাইলিংয়ের জন্য উপযুক্ত।
@Warmup(iterations = 5) JVM প্রস্তুত করতে ওয়ার্মআপ পুনরাবৃত্তির সংখ্যা নির্দিষ্ট করে। পরিমাপে গোলমাল কমায় কিন্তু মেমরি বৃদ্ধির সমস্যাগুলিকে হাইলাইট করতে পারে।
@Measurement(iterations = 5) JMH বেঞ্চমার্কে পরিমাপের পুনরাবৃত্তির সংখ্যা সেট করে, সঠিক কর্মক্ষমতা মেট্রিক্স ক্যাপচার করা নিশ্চিত করে।

JMH-এ মেমরি জমা করার জন্য কার্যকরী কৌশল

উপরে প্রদত্ত স্ক্রিপ্টগুলির মধ্যে একটি ব্যবহার করে প্রসেস বিল্ডার বেঞ্চমার্কিংয়ের জন্য আলাদা JVM প্রক্রিয়া চালু করতে জাভাতে ক্লাস। এই পদ্ধতি নিশ্চিত করে যে একটি পুনরাবৃত্তি দ্বারা ব্যবহৃত মেমরি পরেরটিকে প্রভাবিত করে না। বিভিন্ন JVM দৃষ্টান্তে বেঞ্চমার্কগুলিকে বিচ্ছিন্ন করে, আপনি প্রতিটি পুনরাবৃত্তির জন্য হিপ মেমরির অবস্থা পুনরায় সেট করেন। আগের ট্রিপ থেকে যাত্রী বহন করার সময় একটি গাড়ির জ্বালানি দক্ষতা পরিমাপ করার চেষ্টা করার কল্পনা করুন। ProcessBuilder প্রতিবার খালি গাড়ি দিয়ে শুরু করার মত কাজ করে, যাতে আরো সঠিক রিডিং হয়। 🚗

আরেকটি পন্থা leverages System.gc() কমান্ড, আবর্জনা সংগ্রহের জন্য একটি বিতর্কিত কিন্তু কার্যকর উপায়। এই কমান্ডটি দিয়ে টীকাযুক্ত একটি পদ্ধতিতে স্থাপন করে @সেটআপ(লেভেল.পুনরাবৃত্তি), JMH নিশ্চিত করে যে আবর্জনা সংগ্রহ প্রতিটি বেঞ্চমার্ক পুনরাবৃত্তির আগে ঘটে। এই সেটআপটি আগের কাজ থেকে বিশৃঙ্খলা এড়াতে কাজের মধ্যে আপনার ওয়ার্কস্পেস পরিষ্কার করার মতো। যদিও System.gc() তাৎক্ষণিক আবর্জনা সংগ্রহের গ্যারান্টি দেয় না, বেঞ্চমার্কিং পরিস্থিতিতে, এটি প্রায়ই মেমরি তৈরি কমাতে সাহায্য করে, সঠিক কর্মক্ষমতা মেট্রিক্সের জন্য একটি নিয়ন্ত্রিত পরিবেশ তৈরি করে।

মত টীকা ব্যবহার @ফর্ক, @ওয়ার্মআপ, এবং @পরিমাপ JMH স্ক্রিপ্টে বেঞ্চমার্কিং প্রক্রিয়ার উপর সূক্ষ্ম-সুরক্ষিত নিয়ন্ত্রণের অনুমতি দেয়। উদাহরণস্বরূপ, @Fork(মান = 1, warmups = 1) ওয়ার্মআপ পুনরাবৃত্তি সহ একটি একক কাঁটা নিশ্চিত করে। এটি একাধিক কাঁটাচামচ থেকে উদ্ভূত হতে পারে এমন ক্রমবর্ধমান মেমরি সমস্যা প্রতিরোধ করে। ওয়ার্মআপ পুনরাবৃত্তিগুলি প্রকৃত বেঞ্চমার্কিংয়ের জন্য JVM প্রস্তুত করে, যা সর্বোত্তম কর্মক্ষমতা নিশ্চিত করতে ওয়ার্কআউটের আগে ওয়ার্ম আপের সাথে তুলনীয়। 🏋️‍♂️ এই কনফিগারেশনগুলি JMH কে সামঞ্জস্যপূর্ণ এবং নির্ভরযোগ্য বেঞ্চমার্কের জন্য একটি শক্তিশালী টুল করে তোলে।

অবশেষে, ইউনিট পরীক্ষার উদাহরণ দেখায় কিভাবে মেমরি আচরণ বৈধ করা যায়। ব্যবহার করে নির্দিষ্ট অপারেশনের আগে এবং পরে মেমরি ব্যবহারের তুলনা করে Runtime.getRuntime(), আমরা আমাদের কোডের পারফরম্যান্সে ধারাবাহিকতা এবং স্থিতিশীলতা নিশ্চিত করতে পারি। কোন অপ্রত্যাশিত চার্জ নিশ্চিত করার জন্য একটি কেনাকাটা করার আগে এবং পরে আপনার ব্যাঙ্ক অ্যাকাউন্ট ব্যালেন্স চেক হিসাবে এটি মনে করুন. এই ধরনের বৈধতাগুলি প্রথম দিকে অসঙ্গতিগুলি সনাক্ত করার জন্য এবং আপনার মানদণ্ডগুলি পরিবেশ জুড়ে অর্থপূর্ণ তা নিশ্চিত করার জন্য গুরুত্বপূর্ণ।

JMH বেঞ্চমার্কে মেমরি জমার সমাধান করা

পদ্ধতি 1: বিচ্ছিন্ন কাঁটাচামচ সহ জাভা মডুলার বেঞ্চমার্কিং

import org.openjdk.jmh.annotations.*;
import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 5)
@Measurement(iterations = 5)
@Fork(value = 1, warmups = 1)
@State(Scope.Thread)
public class MemoryBenchmark {

    @Benchmark
    public int calculate() {
        // Simulating a computational task
        return (int) Math.pow(2, 16);
    }
}

সাবপ্রসেস-মত কৌশল ব্যবহার করে প্রতিটি পুনরাবৃত্তি বিচ্ছিন্ন করুন

পদ্ধতি 2: বিচ্ছিন্ন মৃত্যুদণ্ডের জন্য Java ProcessBuilder ব্যবহার করা

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class IsolatedBenchmark {

    public static void main(String[] args) {
        try {
            ProcessBuilder pb = new ProcessBuilder("java", "-jar", "benchmark.jar");
            pb.inheritIO();
            Process process = pb.start();
            process.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

পুনরাবৃত্তির মধ্যে হিপ মেমরি রিসেট করুন

পদ্ধতি 3: আবর্জনা সংগ্রহ কার্যকর করার জন্য System.gc() ব্যবহার করা

import org.openjdk.jmh.annotations.*;
import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 5)
@Measurement(iterations = 5)
@Fork(1)
@State(Scope.Thread)
public class ResetMemoryBenchmark {

    @Setup(Level.Iteration)
    public void cleanUp() {
        System.gc(); // Force garbage collection
    }

    @Benchmark
    public int compute() {
        return (int) Math.sqrt(1024);
    }
}

ধারাবাহিকতা যাচাই করতে ইউনিট পরীক্ষা

পরিবেশ জুড়ে মেমরির স্থায়িত্ব পরীক্ষা করা হচ্ছে

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class BenchmarkTests {

    @Test
    void testMemoryUsageConsistency() {
        long startMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
        int result = (int) Math.pow(2, 10);
        long endMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
        assertTrue((endMemory - startMemory) < 1024, "Memory usage is inconsistent");
    }
}

মেমরি বৃদ্ধির জন্য JMH বেঞ্চমার্ক অপ্টিমাইজ করা

JMH বেঞ্চমার্কের সময় মেমরি জমা হওয়া বস্তুর ধারণ এবং ক্লাস লোডিং দ্বারা প্রভাবিত হতে পারে। যখন JVM পুনরাবৃত্তির সময় অবজেক্ট তৈরি করে, তখন এই অবজেক্টের রেফারেন্সগুলি অবিলম্বে সাফ নাও হতে পারে, যার ফলে অবিরাম মেমরি ব্যবহার হয়। এটি বড় অবজেক্ট গ্রাফ বা স্ট্যাটিক ক্ষেত্রগুলির সাথে পরিস্থিতিতে আরও বাড়িয়ে তুলতে পারে যা অসাবধানতাবশত রেফারেন্স ধারণ করে। এটি প্রশমিত করার জন্য, নিশ্চিত করুন যে আপনার বেঞ্চমার্ক কোড অপ্রয়োজনীয় স্ট্যাটিক রেফারেন্স এড়িয়ে যায় এবং যেখানে উপযুক্ত সেখানে দুর্বল রেফারেন্স ব্যবহার করে। এই ধরনের অনুশীলনগুলি আবর্জনা সংগ্রহকারীকে অব্যবহৃত বস্তুগুলি দক্ষতার সাথে পুনরুদ্ধার করতে সহায়তা করে। 🔄

আরেকটি প্রায়ই উপেক্ষিত দিক হল থ্রেড-লোকাল ভেরিয়েবলের ভূমিকা। ThreadLocal বেঞ্চমার্কে সহজ হতে পারে কিন্তু সঠিকভাবে পরিচালিত না হলে মেমরি দীর্ঘায়িত হতে পারে। প্রতিটি থ্রেড ভেরিয়েবলের নিজস্ব অনুলিপি ধরে রাখে, যা যদি পরিষ্কার না করা হয় তবে থ্রেডের জীবনচক্র শেষ হওয়ার পরেও টিকে থাকতে পারে। সুস্পষ্টভাবে ব্যবহার করে ভেরিয়েবল মুছে ফেলার মাধ্যমে ThreadLocal.remove(), আপনি বেঞ্চমার্কের সময় অনিচ্ছাকৃত মেমরি ধারণ কমাতে পারেন। এই পদ্ধতিটি নিশ্চিত করে যে একটি পুনরাবৃত্তি দ্বারা ব্যবহৃত মেমরি পরবর্তী শুরু হওয়ার আগে মুক্ত করা হয়।

অবশেষে, বিবেচনা করুন কিভাবে JVM ক্লাস লোডিং পরিচালনা করে। বেঞ্চমার্কের সময়, JMH বারবার ক্লাস লোড করতে পারে, যার ফলে স্থায়ী প্রজন্মের (বা আধুনিক JVM-এ মেটাস্পেস) পদচিহ্ন বৃদ্ধি পায়। ব্যবহার করা @ফর্ক পুনরাবৃত্তিগুলিকে বিচ্ছিন্ন করার জন্য টীকা বা একটি কাস্টম ক্লাস লোডার ব্যবহার করে এটি পরিচালনা করতে সহায়তা করতে পারে। এই পদক্ষেপগুলি প্রতিটি পুনরাবৃত্তির জন্য একটি ক্লিনার ক্লাস লোডিং প্রসঙ্গ তৈরি করে, এটি নিশ্চিত করে যে বেঞ্চমার্কগুলি JVM এর অভ্যন্তরীণ আর্টিফ্যাক্টগুলির পরিবর্তে রানটাইম কর্মক্ষমতার উপর ফোকাস করে। এই অনুশীলনটি প্রকল্পগুলির মধ্যে একটি ওয়ার্কস্পেস পরিষ্কার করার আয়না দেয়, যা আপনাকে একবারে একটি কাজের উপর ফোকাস করতে দেয়। 🧹

JMH-এ Memory accumulation সম্পর্কিত প্রায়শ জিজ্ঞাস্য প্রশ্নাবলী

  1. জেএমএইচ বেঞ্চমার্কের সময় মেমরি জমা হওয়ার কারণ কী?
  2. মেমরি জমে প্রায়ই রক্ষিত বস্তু, সংগ্রহ না করা আবর্জনা, বা JVM-এ বারবার ক্লাস লোডিং থেকে উদ্ভূত হয়।
  3. বেঞ্চমার্কের সময় মেমরি পরিচালনা করতে আমি কীভাবে আবর্জনা সংগ্রহ ব্যবহার করতে পারি?
  4. আপনি স্পষ্টভাবে কল করতে পারেন System.gc() ব্যবহার করে পুনরাবৃত্তির মধ্যে @Setup(Level.Iteration) জেএমএইচ-এ টীকা।
  5. ভূমিকা কি ProcessBuilder বিচ্ছিন্ন বেঞ্চমার্কে ক্লাস?
  6. ProcessBuilder প্রতিটি বেঞ্চমার্কের জন্য নতুন JVM দৃষ্টান্ত শুরু করতে ব্যবহৃত হয়, মেমরির ব্যবহারকে বিচ্ছিন্ন করে এবং পুনরাবৃত্তির মধ্যে ধরে রাখা প্রতিরোধ করে।
  7. কিভাবে @Fork টীকা মেমরি সমস্যা কমাতে সাহায্য?
  8. @Fork মানদণ্ডের জন্য JVM ফর্কের সংখ্যা নিয়ন্ত্রণ করে, পুনরাবৃত্তিগুলি একটি নতুন JVM মেমরি অবস্থা দিয়ে শুরু হয় তা নিশ্চিত করে।
  9. থ্রেড-স্থানীয় ভেরিয়েবল কি মেমরি ধরে রাখতে অবদান রাখতে পারে?
  10. হ্যাঁ, ভুলভাবে পরিচালিত ThreadLocal ভেরিয়েবল মেমরি ধরে রাখতে পারে। সবসময় সঙ্গে তাদের পরিষ্কার ThreadLocal.remove().
  11. জেএমএইচ বেঞ্চমার্কের সময় স্ট্যাটিক ক্ষেত্রগুলি কীভাবে মেমরিকে প্রভাবিত করে?
  12. স্ট্যাটিক ক্ষেত্র অপ্রয়োজনীয়ভাবে বস্তুর রেফারেন্স ধরে রাখতে পারে। এগুলি এড়িয়ে চলুন বা স্মৃতি ধরে রাখার জন্য দুর্বল রেফারেন্স ব্যবহার করুন।
  13. ক্লাস লোডিং কি বেঞ্চমার্কের সময় মেমরি বৃদ্ধির একটি ফ্যাক্টর?
  14. হ্যাঁ, অত্যধিক ক্লাস লোডিং মেটাস্পেস ব্যবহার বাড়াতে পারে। ব্যবহার করে @Fork অথবা একটি কাস্টম ক্লাস লোডার এই সমস্যাটি প্রশমিত করতে পারে।
  15. কিভাবে JMH এর ওয়ার্মআপ ফেজ মেমরি পরিমাপ প্রভাবিত করে?
  16. ওয়ার্মআপ ফেজ JVM প্রস্তুত করে, তবে আবর্জনা সংগ্রহ অপর্যাপ্তভাবে ট্রিগার করা হলে এটি মেমরির সমস্যাগুলিও হাইলাইট করতে পারে।
  17. মেমরি জমে এড়াতে বেঞ্চমার্ক লেখার জন্য সর্বোত্তম অনুশীলন কী?
  18. পরিষ্কার, বিচ্ছিন্ন বেঞ্চমার্ক লিখুন, স্ট্যাটিক ক্ষেত্রগুলি এড়িয়ে চলুন এবং ব্যবহার করুন @Setup পুনরাবৃত্তির মধ্যে মেমরি অবস্থা পরিষ্কার করার পদ্ধতি।
  19. আমি কি বেঞ্চমার্কের সময় প্রোগ্রাম্যাটিকভাবে মেমরি ব্যবহার নিরীক্ষণ করতে পারি?
  20. হ্যাঁ, ব্যবহার করুন Runtime.getRuntime().totalMemory() এবং Runtime.getRuntime().freeMemory() অপারেশনের আগে এবং পরে মেমরি পরিমাপ করতে।

নির্ভরযোগ্য JMH বেঞ্চমার্কের জন্য কার্যকর পদক্ষেপ

JMH বেঞ্চমার্কে মেমরি জমে থাকা সম্বোধন করার জন্য JVM কীভাবে হিপ মেমরি এবং আবর্জনা সংগ্রহ করে তা বোঝার প্রয়োজন। সহজ পদক্ষেপ, যেমন পুনরাবৃত্তি বিচ্ছিন্ন করা এবং স্পষ্টভাবে মেমরি পরিচালনা, সামঞ্জস্যপূর্ণ ফলাফল হতে পারে। এই কৌশলগুলি প্রকল্পগুলিকে উপকৃত করে যেখানে নির্ভরযোগ্য কর্মক্ষমতা পরিমাপ অত্যন্ত গুরুত্বপূর্ণ।

স্ট্যাটিক রেফারেন্স কমানো এবং JMH টীকা ব্যবহার করার মত অভ্যাস গ্রহণ করা পরিষ্কার পুনরাবৃত্তি নিশ্চিত করে। বিকাশকারীরা সাধারণ ত্রুটিগুলি হ্রাস করার সময় মেমরি ব্যবহারের অন্তর্দৃষ্টি অর্জন করে। ফলস্বরূপ, বেঞ্চমার্কগুলি JVM মেমরি আচরণের শিল্পকর্মের পরিবর্তে কর্মক্ষমতার উপর দৃষ্টি নিবদ্ধ করে। 🎯

JMH মেমরি ইস্যু অ্যাড্রেসিংয়ের জন্য উত্স এবং রেফারেন্স
  1. জাভা মাইক্রোবেঞ্চমার্ক হারনেস (JMH) সম্পর্কে বিশদ বিবরণ এবং এর টীকাগুলি অফিসিয়াল ডকুমেন্টেশন থেকে নেওয়া হয়েছে। এ আরও পড়ুন JMH ডকুমেন্টেশন .
  2. আবর্জনা সংগ্রহের অনুশীলন এবং System.gc() এর অন্তর্দৃষ্টি ওরাকল জাভা এসই ডকুমেন্টেশন থেকে উল্লেখ করা হয়েছে। ভিজিট করুন Oracle Java SE: System.gc() .
  3. JVM মেমরি আচরণ এবং বেঞ্চমার্কিং সেরা অনুশীলন সম্পর্কে তথ্য Baeldung-এর নিবন্ধগুলি থেকে নেওয়া হয়েছিল। এ আরও জানুন বেলডং: JVM হিপ মেমরি .
  4. জাভাতে ProcessBuilder ব্যবহার অপ্টিমাইজ করার নির্দেশিকা জাভা কোড গীক্সের একটি টিউটোরিয়াল থেকে উল্লেখ করা হয়েছে। এ আরও অন্বেষণ করুন জাভা কোড গীক্স: প্রসেস বিল্ডার .