Website profiles · Technology insights · Alternatives

delphitools.info No paid content found

Categories: Development Resources & Utilities

Home of SamplingProfiler, a free code profiler for Delphi, DWScript (Delphi Web Script) and other Pascal developer tools, optimization and coding tips [...]

Visit website

Updated: 2026-10-01 06:55 Language: English (default) Access: Normal

Profile views 8 Outbound visits 0
DelphiTools.info Full homepage screenshot
Editorial Review

Website Review

What is DelphiTools.info?

DelphiTools.info is the home site for a small collection of Pascal and Delphi developer tools, best known for SamplingProfiler, a free sampling profiler for Delphi code, and DWScript (Delphi Web Script), an embeddable scripting engine for Delphi applications. The site also carries optimization and coding tips and news about its projects.

H3. What you'll find there

  • SamplingProfiler — a profiler that samples your running program rather than instrumenting every line, so you can find hot spots in real workloads with relatively low overhead.
  • DWScript — a Pascal-style scripting language you can embed in a Delphi host application to let users or configurators extend it without recompiling.
  • Other Pascal tools and news — smaller utilities plus posts about performance work, including recent updates to a fork of DelphiCodeCoverage that add an AI-oriented "Code Coverage Gaps" report format aimed at reducing token use when an assistant helps improve unit test coverage.

H3. Who it's for

Delphi and Object Pascal developers doing performance work or adding scripting to a desktop application. If you write C#, Java or Python, the profiler and scripting engine won't apply to you; the general profiling ideas may, but the tooling is Pascal-specific.

H3. Practical next step

If you're chasing a slow Delphi build, download SamplingProfiler and profile a representative workload first — sampling profilers are most useful when you don't yet know where time goes. If you already suspect a specific routine, a stopwatch or manual timing may be faster than setting up any tool.

For comparison, Delphi's own IDE bundles limited profiling, and commercial options exist; a free sampler is a reasonable starting point before paying for anything. General Delphi community resources include Embarcadero for the IDE itself and GitHub for source and issue tracking of community tools.

How do I use SamplingProfiler to find performance bottlenecks in a Delphi application?

SamplingProfiler is a free sampling profiler for Delphi. Rather than instrumenting every routine, it periodically captures the call stack while your program runs, then aggregates those snapshots into a statistical picture of where time is spent. That makes it good for finding hot spots in a running application with minimal overhead, and weaker at giving exact per-call timings or counts.

A practical workflow

  1. Build with debug information. Sampling profilers resolve addresses to unit, class and method names using the compiled symbols, so a build with debug info (and without heavy optimization stripping that mapping) gives far more readable output.
  2. Reproduce a realistic workload. Launch the app, attach the profiler, then perform the slow operation — load the large file, run the report, process the batch. Sampling only sees what actually executes.
  3. Capture for long enough. A few seconds of sampling may be too few snapshots to distinguish a real hot spot from noise. Let the slow path run repeatedly.
  4. Read the aggregated view, not a single sample. Look for methods that appear consistently across many snapshots and across the whole call tree, including their callers and callees.
  5. Fix the biggest item, then re-measure. Optimization without a before/after comparison tends to move cost around rather than remove it.

Interpreting what you see

Sampling gives you a relative distribution of time, so treat the results as proportions, not absolute milliseconds. Two traps are common:

  • A method that appears often may just be called often, not be slow. Check whether the cost sits in that method itself or in something it calls.
  • Inlined or optimized-away code can distort the picture. If a routine you expect to see is missing, the compiler may have folded it into a caller.

For a concrete case: an application that feels sluggish when opening a large project might show most samples inside a parsing routine — but drilling into its callees may reveal that the real cost is repeated string concatenation or a lookup in a linear list. That distinction determines whether you rewrite the parser or just change a data structure.

Where it fits alongside other tools

Tool type Best for Trade-off
Sampling profiler Finding hot spots in a running app Statistical; no exact call counts
Instrumenting profiler Precise per-call timing and counts Higher overhead; needs rebuilds
Code coverage Finding untested paths Says nothing about speed

DelphiTools.info also hosts DWScript and, per its recent news, an AI-oriented "Code Coverage Gaps" format in a fork of DelphiCodeCoverage — useful if your next step after profiling is strengthening tests around the code you are about to change. See DelphiTools.info for the profiler itself and related Pascal tooling.

Next step: pick one operation your users complain about, profile it end to end, and write down the top three methods by sample share before you change any code. That baseline is what tells you whether your fix worked.

What is DWScript and how does it differ from standard Delphi code?

DWScript is an open-source scripting engine for Delphi and Free Pascal, hosted at DelphiTools.info. It lets a Delphi application run Pascal-like scripts at runtime — supplied by users, stored in config, or edited in a built-in script editor — without recompiling the host program. It is also the engine behind the site's own Pascal tooling, so the same maintainer's sampling profiler and related utilities share its lineage.

How it differs from standard Delphi code

Aspect Standard Delphi code DWScript
When it runs Compiled ahead of time into native executables Interpreted (or bytecode-executed) at runtime from text
Deployment Requires recompilation and redeployment to change Scripts can be edited and reloaded while the app runs
Language surface Full Object Pascal, RTL/VCL/FMX, platform APIs A Pascal-family subset plus script-oriented extensions
Typical author The application's own developers End users, integrators, or technical staff customising behaviour
Access to the host Direct Only through what the host application deliberately exposes

The practical consequence is the trade-off you are buying: DWScript gives you late binding and user extensibility, at the cost of execution speed, of full language and library compatibility, and of a new security surface — scripts are code, so sandboxing and permission limits matter. If your logic must be fast, touch the OS directly, or ship as a single compiled binary, plain Delphi is the right choice. If your users need to change rules, formulas, or workflows without waiting for your release cycle, a scripting layer earns its keep.

A concrete scenario

Consider a Delphi desktop product for engineering calculations. The core solver, UI, and data access stay compiled. The per-customer formulas, validation rules, and report templates live in DWScript files the customer's own analyst can edit. You expose a small set of host objects — say a material database and a unit converter — and nothing else. Upgrades to the solver ship as a new executable; rule changes ship as a text file.

Deciding

Choose DWScript when runtime flexibility is a product requirement and you are willing to design and maintain the host API boundary. Stay with compiled Delphi when performance, full library access, or a closed deployment matter more. A useful middle step: prototype one real customisation your users currently request, and see whether the scripting boundary stays small enough to be safe and fast.

For the engine itself, its samples and its integration notes, start at DelphiTools.info. For the host compiler and language baseline it extends, see Embarcadero.

How can I generate an AI-optimized code coverage report with DelphiCodeCoverage?

You generate the AI-optimized report by using the "Code Coverage Gaps" format (.ccg) in the DelphiTools fork of DelphiCodeCoverage. That format was added specifically to make coverage output cheaper and easier for an AI assistant to consume, so it is the file you hand to the model when asking it to improve unit test coverage.

What the .ccg format changes

Standard coverage reports are built for humans: they list every line, every class, every method, with full paths and repeated structure. Feeding that to an AI burns tokens on lines that are already covered. The .ccg format instead emphasizes the gaps — the code that is not covered — and trims the surrounding noise, which is where the token savings come from.

Practical workflow

  1. Build and run your tests with coverage instrumentation enabled, as you normally would.
  2. Produce the coverage output, and select the Code Coverage Gaps (.ccg) output rather than a full HTML or XML report.
  3. Give the .ccg file to your AI assistant along with a request such as "write tests that close these coverage gaps."
  4. Review the generated tests yourself before committing; coverage gaps tell you where code is untested, not what the correct expected behavior is.

That last point is the real trade-off. A gap report is compact precisely because it omits context, so the AI may invent assertions that match the current implementation rather than the intended behavior. Treat its output as a first draft.

Decision criterion

Use .ccg when your goal is an AI-driven test-writing loop and token cost matters. Use a conventional human-readable report when you need to review coverage with your team, track trends over time, or satisfy an audit — those formats carry the detail people expect.

A concrete scenario

A Delphi team has a large legacy unit with low coverage. Instead of pasting a full HTML report into a chat, they export the .ccg file, ask the assistant to propose tests for the top uncovered methods, then run those tests locally. If a proposed test fails, that is often a signal the code — not the test — is wrong.

For the fork itself and related Pascal tooling, see DelphiTools.info. For the upstream project, see Delphi Code Coverage on SourceForge.

What are some practical Pascal optimization tips for improving application speed?

Practical Pascal optimization starts with measurement, not guesswork: profile a release build under realistic input, fix the top one or two hotspots, then re-measure to confirm the gain. Most speedups come from better algorithms, fewer allocations, and less I/O — not from micro-tweaks.

Where to look first

  • Algorithmic cost: replacing an O(n²) scan with a hash lookup or sorted index usually beats any compiler setting.
  • Allocation churn: reuse objects, buffers and strings; prefer SetLength on an existing buffer over repeated concatenation in loops.
  • String handling: build output with a TStringBuilder or a preallocated buffer instead of Result := Result + ... inside loops.
  • I/O and queries: batch database calls, avoid per-row file opens, and cache repeated lookups.
  • Data layout: pack hot records, use contiguous dynamic arrays, and keep frequently accessed fields together to improve cache behaviour.
  • Bounds and checks: keep range/overflow checking on while developing, then evaluate disabling them only in proven hot paths.
  • Compiler settings: test optimisation and inlining settings on a release build, and verify with benchmarks rather than assuming.

Profiling in practice

For Delphi work, a sampling profiler is the low-friction option: it attaches to a running program and periodically records call stacks, so it shows where time is actually spent without instrumenting every routine. DelphiTools.info hosts SamplingProfiler, a free sampling profiler for Delphi, alongside DWScript and other Pascal developer tools. If your project mixes Pascal with scripting, DWScript is worth knowing as the same author's embeddable Delphi Web Script engine.

A concrete scenario: a desktop app feels slow when opening a large customer list. Rather than rewriting the grid, profile a release build while opening that list. If the sampler shows most samples inside a sort comparator or a per-row database query, fix that path first — for example, sort once and page the results, or fetch the whole result set in one query. Re-profile afterwards; if the hotspot has moved, you have a new target.

Deciding what to change

Symptom Likely cause First move
Slow with large inputs, fine with small Algorithmic complexity Change data structure or indexing
Steady slowdown over time Leaks, growing lists, unbounded caches Cap caches, free objects, check ownership
Spiky pauses Allocation or GC-like churn, large string builds Preallocate, reuse buffers
Slow startup Initialisation, file or registry reads Defer work until first use

Next step: pick one user-visible slow operation, profile it on a release build, and write down the top three routines by sample count before changing any code. That list becomes your optimisation backlog, and it keeps effort pointed at changes you can actually verify.

How does the DelphiCodeCoverage 'Code Coverage Gaps' format save tokens when using AI to improve unit tests?

DelphiTools.info describes a .ccg "Code Coverage Gaps" format added to a fork of DelphiCodeCoverage, explicitly aimed at reducing the number of tokens an AI assistant has to read when you ask it to improve unit-test coverage. The saving comes from what the format leaves out rather than from compression: instead of feeding an AI a full coverage report listing every unit, class and line — including the large majority that are already covered — the gaps format is structured around the code that is not covered, so the model reads a short list of targets instead of a complete map of your codebase.

Why that matters in practice

Coverage tools normally emit detailed per-line or per-method records for the whole project. For an AI workflow, most of that is dead weight: the assistant only needs to know which routines lack tests and where they live. A gaps-oriented file reduces input tokens roughly in proportion to how much of the code is already covered, so a project at high coverage benefits most. Fewer input tokens means lower per-request cost and less chance of the model losing the relevant detail in a long context.

A concrete scenario

Suppose a unit has 40 methods and 34 are tested. A conventional report hands the AI all 40 with hit counts; a gaps report hands it the six untested ones. You then ask for tests covering those six, and the assistant works from a focused list rather than scanning and filtering a full report — which also reduces the risk of it writing redundant tests for code that is already covered.

Trade-offs to weigh

  • The format is only as good as the coverage run behind it: stale or partial coverage produces a misleading gap list.
  • It is optimized for AI consumption, not for human review or historical trend reporting, so you may still want the standard report for dashboards and regressions.
  • The page notes these enhancements were pushed to a fork, with uncertainty about whether the original repository is still maintained — so check which fork or version you are actually running before relying on the format.
  • Token savings shrink as coverage approaches completeness, and disappear if gaps are scattered across many files, since file paths and context still cost tokens.

Next step

Run your coverage tool once, generate both the standard report and the gaps file, and compare their sizes. If the gaps file is dramatically smaller, make it the artifact you attach when prompting an AI about test coverage, and keep the full report for your own review.

For the tool itself and related Pascal utilities, see DelphiTools.info.

Related questions

More questions →
What Is a Profiler and How Does a Sampling Profiler Find Performance Bottlenecks?

A profiler is a development tool that measures where a program spends its time and resources, so you can find the code responsible for slowness instead of guessing. A sampling profiler does this by periodically capturing the call stack of a running program rather than modifying the code itself. This makes it useful when you want a quick, low-overhead picture of hot spots in an application — for example, a Delphi program — without recompiling with instrumentation. DelphiTools.info hosts SamplingProfiler, described as a free code profiler for Delphi, which is a concrete example of this category.

What a profiler actually measures

Profiling answers questions like:

  • Which functions or methods consume the most CPU time?
  • Which call paths lead into those expensive functions?
  • Where does execution spend time that you did not expect?

The output is typically a ranked list of routines by cost, often paired with a call graph or call tree showing how those routines were reached. The goal is to turn "the program feels slow" into "this specific routine, called from this path, dominates execution time."

Sampling vs. instrumenting profilers

There are two common approaches, and they trade off differently.

Dimension Sampling profiler Instrumenting profiler
How it works Interrupts the program at intervals and records the current call stack Inserts measurement code into functions (at compile time or via hooks)
Overhead Generally lower, since it does not run code on every call Higher, because every instrumented call pays a cost
Accuracy Statistical — results improve with longer runs and more samples Exact call counts and timings for instrumented points
Code changes Usually none required Often requires recompiling or special builds
Best for Finding hot spots and dominant call paths quickly Precise per-call counts and fine-grained timing

Because a sampling profiler observes rather than instruments, it can be attached to a running program and left on for a while. The longer it samples, the more stable the picture becomes.

How a sampling profiler finds bottlenecks

The mechanism is straightforward:

  1. A timer or OS interrupt fires at a set interval. Each firing is one sample.
  2. At each sample, the profiler walks the current call stack and records which routine is executing and which routines called it.
  3. Samples accumulate into a statistical distribution. A routine that appears in many samples is, by inference, consuming a large share of execution time.
  4. The profiler aggregates results into a ranked list of hot routines and the call paths that reach them.

The key insight is that you do not need to measure every call. If a routine is genuinely expensive, it will be caught by enough random samples to stand out. A routine that appears in 30% of samples is a strong candidate for optimization; one that appears in 0.1% is probably not worth your time.

A concrete example

Suppose a Delphi application feels sluggish when loading a large dataset. You run SamplingProfiler against it and let it collect samples during the slow operation. The results show that a sorting routine deep in a utility unit accounts for most of the samples, called repeatedly from a data-loading path. That tells you where to focus: the sorting algorithm or the number of times it is invoked — not the database layer you initially suspected.

What sampling profilers reveal and what they miss

They reveal well:

  • Dominant hot spots — routines that consume a large fraction of total time.
  • Call paths — how execution reaches those hot spots.
  • Relative cost — which of several candidates matters most.

They are weaker at:

  • Very short or rarely-called routines, which may not appear in enough samples.
  • Exact call counts — sampling gives statistical estimates, not precise numbers.
  • Very fast operations — if a routine runs for a tiny fraction of total time, sampling may not distinguish it from noise.

This is why sample duration matters. A short profiling run may produce a noisy or misleading ranking; a longer run over a representative workload gives a more reliable picture.

Typical use cases

  • Finding performance bottlenecks in an existing application before deciding what to optimize.
  • Validating an optimization by comparing profiles before and after a change.
  • Understanding unfamiliar code by seeing which paths actually execute at runtime.
  • Investigating a specific slow operation, such as startup, a batch job, or a UI action.

A concrete tool: Delphi SamplingProfiler

DelphiTools.info is the home of SamplingProfiler, described as a free code profiler for Delphi. For Delphi developers, this is a direct example of the sampling approach: you profile a running application, collect samples, and get a ranked view of where time is spent. The site also hosts DWScript (Delphi Web Script) and other Pascal developer tools, so it is a relevant starting point if you work in that ecosystem.

If you are choosing a profiler, the practical questions are: does it support your language and runtime, does it require code changes, and does its sampling or instrumentation model match what you need — quick hot-spot discovery versus exact call accounting.

What Is Developer Marketing and How Does It Drive Signups?

Developer marketing is the practice of reaching software developers where they already learn and make tooling decisions—technical content, creator channels, open source, and community—and turning that attention into product signups. It differs from traditional marketing because the audience evaluates tools on technical merit, tries before trusting, and ignores polished ad copy. It's the right approach when your product is an AI or DevTools offering and your bottleneck is distribution rather than product quality.

Why distribution, not product, is usually the bottleneck

Most AI and DevTools teams are founded by people who can build. The failure mode described by DevTools Academy is "Great Product, Broken Distribution"—the tool works, but the people who would use it never hear about it in a context they trust.

Developers don't convert on impressions. They convert after seeing a credible peer use the tool, reading a technical walkthrough, or watching someone solve a real problem with it. That means the marketing job is not persuasion—it's placement in front of the right technical audience with proof attached.

How developer marketing differs from traditional marketing

Dimension Traditional marketing Developer marketing
Primary audience Broad buyers, often non-technical Practitioners who evaluate the tool themselves
Trust source Brand claims, ads Peers, creators, open source maintainers
Content format Campaigns, landing pages Tutorials, demos, technical newsletters, community threads
Success signal Impressions, brand recall Signups, engagement, reposts, comments
Channel mix Paid media, PR YouTube, X, LinkedIn, Reddit, UGC, technical newsletters

The practical consequence: budget spent on speculative reach tends to underperform compared to a systematic creator partnership framework, which is the shift DevTools Academy describes making for Orchids.

The creator-led distribution model

Creator-led developer marketing means partnering with technical creators who already have the audience you want, rather than buying reach through ads. DevTools Academy runs this across YouTube, X, LinkedIn, Instagram, TikTok, Reddit, UGC, and technical newsletters.

The mechanics that make it work:

  • Credibility transfer. A creator who understands the tooling explains it in their own voice, so the recommendation carries weight an ad cannot.
  • Depth over volume. The goal is "developers, not just impressions"—a smaller, engaged technical audience beats a large passive one.
  • Repeatability. A creator program built once can produce consistent output quarter after quarter instead of one-off spikes.

For Stream, this approach was credited with 6,600+ sign-ups across every quarter of FY-2025, with a program built from the ground up spanning 60+ creators across YouTube, X, LinkedIn, open source, and newsletters.

What execution looks like end to end

DevTools Academy frames its work as "end-to-end developer GTM execution" and "numbers, not narratives." A workable sequence for a team running this themselves:

  1. Identify where your developers already are. Pick the two or three channels where your target users actually spend time—not all of them at once.
  2. Recruit creators with technical credibility. Prioritize people who can use the product and explain it, over reach alone.
  3. Give them something real to show. A working integration, a benchmark, or a solved problem produces better content than a feature list.
  4. Let the content run in the creator's format. Tutorials and demos outperform scripted promotion on technical channels.
  5. Measure signups and engagement, not just reach. Track comments, reposts, and sign-ups per channel so you can reallocate.

How to measure whether it's working

The evidence from DevTools Academy's case studies points to a measurement set that goes beyond impressions:

  • Signups — the primary outcome. Stream: 6,600+ sign-ups across FY-2025 quarters.
  • Engagement depth — comments and reposts as a signal of real technical interest. Oumi's LinkedIn launch produced 631+ comments and 269+ reposts on day one.
  • Impressions and engagements at scale — Orchids reached 1.1M impressions and 10,000+ engagements in a single quarter.
  • Consistency over time — growth that repeats every quarter, not a single viral moment.

Oumi's founder described the value as watching "the comment section turn into a deep-dive discussion on day one"—that discussion is the social proof that drives the next wave of signups.

When this approach fits

Creator-led developer marketing is a strong fit when:

  • Your product is an AI or DevTools offering aimed at working developers.
  • The product is good but under-distributed.
  • You can support a program over multiple quarters rather than a single campaign.
  • You're willing to trade speculative spend for a structured creator framework.

It's a weaker fit if your buyers are non-technical, if you have no working product to demonstrate, or if you need results within days rather than a quarter.

Where to start

If you want to assess your current position before committing, DevTools Academy offers a "See how your current GTM stacks up" entry point alongside strategy calls and published case studies. The useful first step for most teams is auditing which channels already produce signups, then concentrating creator partnerships there instead of spreading across every platform at once.

What Is Delphi and What Tools Are Available for Delphi Development?

Delphi is an Object Pascal-based language and integrated development environment (IDE) used to build native applications, historically for Windows and now for cross-platform targets. If you write Delphi code, the practical question is usually not "what is Delphi" but "what do I use to profile it, script it, or measure test coverage?" The DelphiTools.info project is one place that answers that: it hosts a free sampling profiler, the DWScript (Delphi Web Script) engine, and related Pascal developer tools, plus optimization and coding tips.

What Delphi actually is

Delphi combines a compiled language (Object Pascal) with a visual IDE. You write Pascal source, the compiler produces native machine code, and the IDE handles forms, components, and debugging. That compiled-native model is why performance tooling matters: there is no interpreter or VM sitting between your code and the CPU, so bottlenecks show up as real CPU time in your own routines.

Tool categories in the Delphi ecosystem

Category What it does Example from DelphiTools.info
Sampling profiler Periodically samples the call stack to find where time is spent SamplingProfiler
Scripting engine Embeds a Pascal-like scripting language into a host app DWScript (Delphi Web Script)
Code coverage Records which lines/branches tests execute DelphiCodeCoverage
Optimization guidance Tips and techniques for faster Pascal code Site articles and notes

How a sampling profiler helps

A sampling profiler interrupts execution at intervals and records the current call stack, then aggregates the samples. The routines that appear most often are where your program spends its time. This differs from instrumenting every function: sampling adds little overhead and does not require you to modify source, so you can profile a realistic build.

For example, if a Delphi app feels slow when loading a large dataset, a sampling profile will show whether the time sits in parsing, in string handling, or in a database call — and you optimize the routine that actually dominates rather than guessing.

What DWScript offers

DWScript is an embeddable scripting engine that brings a Pascal-like language into a Delphi host application. Instead of recompiling the whole program to change behavior, you expose parts of your app to scripts and let users or your own team write logic in a familiar Pascal syntax. It is aimed at developers who want scripting inside a compiled Delphi product without adopting an unrelated language.

Code coverage and coverage-gap analysis

DelphiCodeCoverage measures which parts of your code your tests actually run. The project's fork added a "Code Coverage Gaps" .ccg format designed to be consumed by AI tooling, which the author notes can reduce token usage when you ask an AI to improve unit test coverage. The practical use: run your tests, generate coverage data, and identify untested paths — then target new tests at those gaps rather than at code already covered.

Choosing what to reach for

  • Performance problem in a compiled build → start with a sampling profiler.
  • Need user- or config-driven logic without recompiling → consider an embeddable engine like DWScript.
  • Tests exist but you don't know what they miss → use a code coverage tool and review the gaps.

Each of these solves a different problem, and they are complementary: profile to find slow code, script to make behavior flexible, and measure coverage to keep tests honest.

What Is SamplingProfiler for Delphi and How Do You Use It to Find Bottlenecks?

SamplingProfiler is a free code profiler for Delphi and other Pascal toolchains, distributed from DelphiTools.info alongside DWScript (Delphi Web Script) and related Pascal developer tools. It finds bottlenecks by statistical sampling: it periodically captures the call stack of a running application and aggregates those snapshots into per-routine sample counts, so the routines that appear most often are the ones consuming the most execution time. Use it when you have a compiled Delphi application that feels slow and you want to know where the time goes without adding timing code to every routine.

What SamplingProfiler is

DelphiTools.info describes itself as the home of SamplingProfiler, "a free code profiler for Delphi, DWScript (Delphi Web Script) and other Pascal developer tools," alongside optimization and coding tips. The site also hosts DWScript and other Pascal tools, and its news covers adjacent developer utilities such as a fork of DelphiCodeCoverage with AI-oriented reporting formats.

Two consequences follow from that positioning:

  • It is a sampling profiler, not an instrumenting one. You do not modify your source to insert timers or counters.
  • It targets Delphi and Pascal code, including scripted Pascal through DWScript, rather than being a general-purpose profiler for arbitrary languages.

How statistical sampling locates hot code

A sampling profiler does not measure every call. Instead it interrupts the process at intervals, walks the current call stack, and records which routine is on top (and often the full chain of callers). After thousands of samples, the distribution of samples across routines approximates the distribution of time across routines.

The practical implications:

Property What it means for you
No source instrumentation You can profile a build you already have, as long as symbols are available
Statistical, not exact Results are approximate; short runs give noisy rankings
Stack-based You see call paths, not just flat totals, so you can tell who called the hot routine
Low overhead relative to instrumentation The app keeps running close to normal speed, which matters for interactive or I/O-heavy code

The routine with the largest share of samples is your first bottleneck candidate. If a routine is hot but only ever called from one place, the fix may belong in the caller; if it is called from many places, the routine itself is the target.

Using it to find bottlenecks

The general workflow, which applies to SamplingProfiler and to sampling profilers in this family:

  1. Build with debug information. Compile the application so that routine names and line information are available. Without symbols, samples collapse into addresses and the profile is unreadable.
  2. Reproduce the slow scenario. Start the application and drive it into the state you care about — load the large file, run the heavy calculation, open the slow form. Profiling an idle app tells you nothing.
  3. Attach the profiler and start sampling. Point SamplingProfiler at the running process and begin a session. Let the scenario run long enough to accumulate a meaningful number of samples; a few seconds of activity is usually too few.
  4. Stop and read the results. Sort by sample count or by self time. Identify the top routines and, using the call graph, trace which paths reach them.
  5. Fix and re-measure. Change one thing, re-run the same scenario, and compare. Sampling noise means you should look for large, repeatable shifts rather than small deltas.

The expected result at each step: after step 3 you have a sample set; after step 4 you have a ranked list of routines and their callers; after step 5 you have evidence that your change actually moved the bottleneck rather than just moving it elsewhere.

Common pitfalls

  • Missing debug symbols. The most common reason a profile looks like a wall of addresses. Rebuild with debug info before profiling.
  • Optimization settings. Aggressive optimization can inline routines, so a hot routine may be attributed to its caller. Treat inlined results as a hint about the call site, not a precise per-routine measurement.
  • Runs that are too short. Sampling needs volume. A scenario that finishes in a fraction of a second may produce too few samples to rank reliably; loop it or extend it.
  • Profiling the wrong scenario. If the app is slow only under a specific input or after a specific sequence of actions, reproduce exactly that, or you will optimize code that was never the problem.
  • Chasing the top entry blindly. A routine high in the list may be a dispatcher or framework call that is simply on every path. Look at self time and at whether the routine does real work.

Where it fits among Delphi tools

DelphiTools.info groups SamplingProfiler with DWScript and other Pascal developer tools, and its news stream covers related utilities such as the AI-optimized DelphiCodeCoverage report format. If your goal is coverage rather than timing, that is a different tool; if your goal is to know where execution time is spent in a running Delphi or Pascal application, SamplingProfiler is the one to reach for. The site does not state pricing on the material available here beyond describing the profiler as free, so treat any licensing or version-support question as something to confirm on the site itself.

What Is Sampling in Profiling and How Does a Sampling Profiler Find Performance Bottlenecks?

Sampling in profiling means periodically capturing the call stack of a running program instead of instrumenting every function entry and exit. A sampling profiler interrupts the process at short intervals, records which function is executing at that instant, and aggregates those snapshots into a statistical picture of where time is spent. The result is a low-overhead estimate of hot spots that requires no source changes — at the cost of being approximate rather than exact.

How sampling differs from instrumenting profilers

An instrumenting profiler rewrites or hooks each function so it can count calls and measure durations precisely. That precision has a price: added overhead per call, distorted timing for very short functions, and often a need to rebuild the code with special flags.

A sampling profiler takes the opposite approach:

  • Input: a running process (or a launched executable) plus a sampling interval, typically in the low milliseconds.
  • Action: at each tick, the profiler walks the current call stack and records the frames.
  • Output: counts and percentages per function, per module, or per call path.

Because it observes rather than modifies, sampling usually adds only a small, roughly constant overhead, and it can profile release builds that match what users actually run.

Why the numbers are statistical

Each sample is a snapshot. If a function appears in 30% of samples, the estimate is that roughly 30% of execution time was spent there. That estimate gets more reliable as the sample count grows, which is why longer runs and shorter intervals produce steadier results.

Two consequences follow:

  • Short or rarely called routines can be missed if they never happen to be on the stack when a tick fires. Increase the run duration or lower the interval to catch them.
  • Inlined code blurs attribution. If the compiler inlined a small function into its caller, samples land on the caller, not the original function. The same applies to code with no distinct stack frame.

Treat the output as a ranking of where time goes, not as an exact accounting.

Reading a sampling profiler's output

Most sampling profilers present the same core views:

View What it shows How to use it
Flat / function list Self time per function Find the top entries — these are your first candidates
Call tree / callers-callees Which paths lead to a hot function Decide whether the cost is intrinsic or caused by a caller
Module breakdown Time per DLL/unit Separate your code from framework or library cost

The workflow is straightforward:

  1. Run the target under the profiler and exercise the slow scenario.
  2. Sort by self time and look at the top few functions.
  3. For each, check the call tree to see who calls it and how often.
  4. Change one thing, re-profile, and compare — the ranking should shift if the fix worked.

A function high in self time is doing work directly; a function high in total (inclusive) time but low in self time is mostly waiting on its callees, so look further down the tree.

A concrete tool: SamplingProfiler for Delphi/Pascal

DelphiTools.info is the home of SamplingProfiler, a free code profiler for Delphi, alongside DWScript and other Pascal developer tools. For Delphi and Pascal work it is the practical example of the workflow above: attach to or launch a build, collect samples while the application runs, then inspect the aggregated function and call-path data to locate bottlenecks. The same site publishes optimization and coding tips, which pair naturally with profiling results — you profile to find the hot function, then apply targeted optimization rather than guessing.

Trade-offs to keep in mind

  • Low overhead, approximate results. Good for finding the dominant cost; not a substitute for exact call counts.
  • Blind spots for tiny or inlined routines. Mitigate with longer runs, finer intervals, or targeted instrumentation if you need certainty.
  • Needs a representative workload. Samples only reflect what you actually execute, so profile the scenario you care about.
  • Debug vs. release builds. Sampling can profile optimized builds, which is usually what you want, but symbol information must be available to map addresses back to function names.

If you need exact per-call timing for a handful of functions, an instrumenting profiler is the better fit. If you need to know, quickly and cheaply, where a large Delphi or Pascal application spends its time, sampling is the right starting point.

Website Overview

Identifiable technologies and additional version or configuration signals make the service easier to fingerprint, which may help targeted scanners narrow their checks. An established domain and managed infrastructure suggest continuity of operations and may support dependable delivery, although neither guarantees service quality.

Domain and Registration

Registered in 2009, this domain has about 17 years of history. That suggests continuity, although ownership and purpose may have changed. Transfer-protection status is present, helping reduce the risk of unauthorized domain transfers. The registrar is Cloudflare, Inc, a widely used domain service provider. The domain uses the common .info extension, which is not an independent safety signal.

DNS and Email

Nameservers are provided by Cloudflare, indicating managed DNS hosting. MX records point to the Mailgun email service. DNSSEC is enabled, allowing validating resolvers to authenticate signed DNS data. No CNAME was found; the observed records resolve directly to addresses. SPF and DMARC are configured. DKIM status is unknown.

TLS and Certificates

The public key uses EC with 256 bits. The server supplied a complete certificate chain. No organization name is present in the certificate; the available fields are consistent with domain validation. The certificate was issued within the Google Trust Services cloud or CDN ecosystem. The certificate's total validity is about 90 days, consistent with a short renewal cycle.

HTTP and Browser Security

The checked browser-security headers were not detected, leaving fewer explicit browser-side safeguards. No X-Powered-By header was found, reducing one common source of backend fingerprinting information. The cf-ray response header indicates a CDN or caching proxy in the delivery path. No obvious internal addresses or debug information were found in the headers. The Server header identifies cloudflare without an exact version.

Technology Stack Analysis

The public page identifies All in One SEO (AIOSEO) 5.0.2, WordPress, jQuery, Google Analytics, Cloudflare, with exact versions exposed for 1 technologies. These details can narrow vulnerability checks, although exposure alone is not a vulnerability.

Search and Social Sharing

The title has 76 characters and may be truncated in search results. The Generator tag identifies All in One SEO (AIOSEO) 5.0.2, making the publishing system easier to fingerprint. No Open Graph metadata was detected, so social previews may depend on platform inference. JSON-LD includes Organization data, helping describe the organization as an entity. A meta description is present, with 156 characters.

Hosting and Email

DNSCloudflare
HostingCloudflare
EmailMailgun
Location Location unknown 104.21.13.223

User reviews (0)

  • No reviews yet.

Pages, Search and Sharing

Meta descriptionHome of SamplingProfiler, a free code profiler for Delphi, DWScript (Delphi Web Script) and other Pascal developer tools, optimization and coding tips [...]
Canonical URLhttps://www.delphitools.info/
LanguageEnglish (default)
Twitter CardNot detected

Unknown

All bots 1 allowed · 1 disallowed
  • Allow/
  • Disallow/wp-admin/
008 0 allowed · 1 disallowed
  • Disallow/
voltron 0 allowed · 1 disallowed
  • Disallow/
bytespider 0 allowed · 1 disallowed
  • Disallow/
gptbot 0 allowed · 1 disallowed
  • Disallow/
perplexitybot 0 allowed · 1 disallowed
  • Disallow/

Registration details RDAP / WHOIS

RegistrarCloudflare, Inc
Registered2009-02-26
Expires2027-02-26
Domain statusclient transfer prohibited
Nameserversdora.ns.cloudflare.com、jake.ns.cloudflare.com
DNSSECsigned

DNS records

TypeNameValueTTLPriority
Awww.delphitools.info104.21.13.223300—
Awww.delphitools.info172.67.133.79300—
MXdelphitools.infomxa.mailgun.org3001
MXdelphitools.infomxb.mailgun.org300100
NSdelphitools.infodora.ns.cloudflare.com86400—
NSdelphitools.infojake.ns.cloudflare.com86400—
TXTdelphitools.infogoogle-site-verification=m44YbPeg9QZFVuzV7yN7U_m96wWTEbGydCRLP9j4KI0300—
TXTdelphitools.infov=spf1 include:mailgun.org ~all300—
DSdelphitools.info2371 13 2 5a5db25ac899eddd49488a1cbddfe965c6f3ea48d6b094adf7670bf8f0b64f373600—
DMARC_dmarc.delphitools.infov=DMARC1; p=reject300—

TLS and certificates

AssessmentNormal configuration
Supported protocolsTLSv1.2、TLSv1.3
Negotiated protocolTLSv1.3
Certificate subjectdelphitools.info
IssuerGoogle Trust Services
Valid until2026-12-16T21:53 · Remaining when checked: 76 days
Verification detailsCertificate trust: Passed · Hostname match: Passed

HTTP response headers

HeaderValue
content-typetext/html; charset=UTF-8
servercloudflare

Identified technologies

All in One SEO (AIOSEO) 5.0.2WordPressjQueryGoogle AnalyticsCloudflare