# BeginSampleWithMetadata(IntPtr, int, void*)

> Starts profiling a piece of code marked with a custom name that the markerPtr handle and metadata parameters has defined.

## Definition

* **Type:** Method
* **Namespace:** [Unity.Profiling.LowLevel.Unsafe](/engine/6000.0/script-reference/unity/profiling/lowlevel/unsafe.md)
* **Assembly:** UnityEngine.CoreModule

```csharp
public static void BeginSampleWithMetadata(IntPtr markerPtr, int metadataCount, void* metadata)
```

### Parameters

**** (\[IntPtr]\(https\://learn.microsoft.com/dotnet/api/system.intptr)): Profiler marker handle.**** (\[int]\(https\://learn.microsoft.com/dotnet/api/system.int32)): Metadata parameters count.**** (\[void\*]\(https\://learn.microsoft.com/dotnet/api/system.void)): Unsafe pointer to the ProfilerMarkerData array.

### Remarks

Code marked with [ProfilerUnsafeUtility.BeginSampleWithMetadata](/engine/6000.0/script-reference/unity/profiling/lowlevel/unsafe/profilerunsafeutility/beginsamplewithmetadata.md) and [ProfilerUnsafeUtility.EndSample](/engine/6000.0/script-reference/unity/profiling/lowlevel/unsafe/profilerunsafeutility/endsample.md) shows up in the Profiler hierarchy. Always use [ProfilerUnsafeUtility.EndSample](/engine/6000.0/script-reference/unity/profiling/lowlevel/unsafe/profilerunsafeutility/endsample.md) to close a started section of the instrumented code.

In the Timeline view of the Profiler Window the provided *metadata* is available in the tooltip message. Use [HierarchyFrameDataView.GetItemMetadata](/engine/6000.0/script-reference/unityeditor/profiling/hierarchyframedataview/getitemmetadata.md) to retrieve metadata programmatically.

**Note:** Both [ProfilerUnsafeUtility.BeginSampleWithMetadata](/engine/6000.0/script-reference/unity/profiling/lowlevel/unsafe/profilerunsafeutility/beginsamplewithmetadata.md) and [ProfilerUnsafeUtility.EndSample](/engine/6000.0/script-reference/unity/profiling/lowlevel/unsafe/profilerunsafeutility/endsample.md) are thread safe and can be used in jobified code.

The low level Profiler API is included in a Release Build.

```csharp
using Unity.Collections.LowLevel.Unsafe;
using Unity.Profiling;
using Unity.Profiling.LowLevel;
using Unity.Profiling.LowLevel.Unsafe;
using System;

class Example
{
    static IntPtr MakeMarkerWithIntMetadata(string name, string paramName)
    {
        var handle = ProfilerUnsafeUtility.CreateMarker(name, ProfilerUnsafeUtility.CategoryScripts, MarkerFlags.Default, 1);
        ProfilerUnsafeUtility.SetMarkerMetadata(handle, 0, paramName, (byte)ProfilerMarkerDataType.Int32, (byte)ProfilerMarkerDataUnit.Count);
        return handle;
    }

    static readonly IntPtr markerHandle = MakeMarkerWithIntMetadata("MyMarker", "Work Idx");

    static unsafe void DoWork(int num)
    {
        var metadata = stackalloc ProfilerMarkerData[1];
        metadata[0].Type = (byte)ProfilerMarkerDataType.Int32;
        metadata[0].Size = (uint)UnsafeUtility.SizeOf<int>();
        metadata[0].Ptr = UnsafeUtility.AddressOf(ref num);
        ProfilerUnsafeUtility.BeginSampleWithMetadata(markerHandle, 1, metadata);
        //...
        ProfilerUnsafeUtility.EndSample(markerHandle);
    }
}
```

Use [Recorder](/engine/6000.0/script-reference/unityengine/profiling/recorder.md) to obtain per-frame timings in the Player for the specific marker name.

Additional Resources: [ProfilerUnsafeUtility.EndSample](/engine/6000.0/script-reference/unity/profiling/lowlevel/unsafe/profilerunsafeutility/endsample.md), [ProfilerUnsafeUtility.CreateMarker](/engine/6000.0/script-reference/unity/profiling/lowlevel/unsafe/profilerunsafeutility/createmarker.md), [ProfilerUnsafeUtility.SetMarkerMetadata](/engine/6000.0/script-reference/unity/profiling/lowlevel/unsafe/profilerunsafeutility/setmarkermetadata.md).
